Ce n' $.lors de l'.appliquer($, someArray) faire?
Je suis la lecture sur Deferreds et des Promesses et de garder à venir à travers $.when.apply($, someArray)
. Je suis un peu dans le flou sur ce qu'il fait exactement, la recherche d'une explication qui une ligne fonctionne exactement (pas la totalité de l'extrait de code). Voici le contexte:
var data = [1,2,3,4]; //the ids coming back from serviceA
var processItemsDeferred = [];
for(var i = 0; i < data.length; i++){
processItemsDeferred.push(processItem(data[i]));
}
$.when.apply($, processItemsDeferred).then(everythingDone);
function processItem(data) {
var dfd = $.Deferred();
console.log('called processItem');
//in the real world, this would probably make an AJAX call.
setTimeout(function() { dfd.resolve() }, 2000);
return dfd.promise();
}
function everythingDone(){
console.log('processed all items');
}
.done()
peut être utilisé à la place de.then
dans ce cas, juste pour info- fwiw, il y a un Différé de port pour souligner ce qui permet de passer d'une matrice unique de
_.when
de sorte que vous n'avez pas besoin d'utiliserapply
- En savoir plus sur
.apply
: developer.mozilla.org/en-US/docs/JavaScript/Reference/.... - connexes: stackoverflow.com/questions/1986896/...
- L'article de l'OP se réfère dans sa première phrase a déplacé les lieux - c'est maintenant sur : flaviocopes.com/blog/deferreds-and-promises-in-javascript .
Vous devez vous connecter pour publier un commentaire.
.appliquer
est utilisé pour appeler une fonction avec un tableau d'arguments. Il prend chaque élément dans le tableau, et utilise chaque en tant que paramètre à la fonction..apply
pouvez également modifier le contexte (this
) à l'intérieur d'une fonction.Alors, prenons
$.when
. Il est utilisé pour dire "quand toutes ces promesses sont résolus... faire quelque chose". Il faut une infinie (variable) nombre de paramètres.Dans votre cas, vous avez un tableau de promesses; vous ne savez pas combien de paramètres que vous êtes de passage à
$.when
. En passant le tableau lui-même à$.when
ne marcherait pas, parce qu'il attend de ses paramètres de promesses, pas un tableau.C'est là que
.apply
vient dans. Il faut de la matrice, et les appels$.when
avec chaque élément comme un paramètre (et permet de s'assurer de lathis
est fixé àjQuery
/$
), alors que tout fonctionne 🙂$.when
juste attend tous d'être terminée avant de continuer.$.when($, arrayOfPromises).done(...)
et$.when(null, arrayOfPromises).done(...)
(que j'ai trouvé à la fois comme des solutions proposées dans les forums...)$.lorsque prend un nombre quelconque de paramètres et résout quand tous ces ont résolu.
anyFunction.appliquer(cettevaleur, arrayParameters) appelle la fonction anyFunction réglage de son contexte (cettevaleur sera le ce au sein de cet appel de fonction) et passe tous les objets dans arrayParameters comme des paramètres individuels.
Par exemple:
Est la même chose que:
Mais la appliquer de l'appel vous permet de passer un tableau de l'inconnu nombre de paramètres. (Dans votre code, vous dites que vous données provient d'un service, alors que c'est le seul moyen pour appeler $.lorsque)
Ici, le code entièrement documentées.
$.when.apply($, array)
est pas le même que$.when(array)
. C'est la même chose que:$.when(array[0], array[1], ...)
Malheureusement, je ne peux pas d'accord avec vous les gars.
Appellera
everythingDone
dès que l'un différé obtient rejeté, même si il y a d'autres deferreds qui sont en attendant.Voici le script complet (je recommande http://jsfiddle.net/):
Il ce un bug? Je voudrais l'utiliser comme le monsieur ci-dessus décrit.
Peut-être quelqu'un peut trouver cela utile:
everythingDone n'est pas appelé en cas de rejeter
$.quand il est seul rend possible pour une fonction de rappel à appeler lorsque toutes les promesses du passé sont résolus/rejeté. Normalement, $.lorsqu'on prend un nombre variable d'arguments, à l'aide .appliquer rend-il possible de passer un tableau d'arguments, c'est très puissant. Pour plus d'infos sur .s'appliquent: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply
Merci pour votre solution élégante:
Juste un point: Lors de l'utilisation de
resolveWith
d'obtenir certains paramètres, il se casse à cause de la promesse initiale indéfinie. Ce que j'ai fait pour le faire fonctionner: