Puis-je faire une promesse synchrone dans la bibliothèque JavaScript Q?
Je veux faire quelque chose comme ce qui suit:
delay( 2500 )
.then( function () { console.log( "Step 1 done" ) } )
.then( delay( 7500 ) )
.then( function () { console.log( "Step 2 done" ) } );
Donc la mise en œuvre de retard a été démontré à de nombreuses reprises avant:
function delay( ms ) {
var deferred = Q.defer();
setTimeout( deferred.resolve, ms );
return deferred.promise;
}
Mais si je lance le ci-dessus dans node.js j'obtiens:
... delay of 2500ms
Step 1 done
Step 2 done
... delay of ~7500ms
plutôt que de ce que j'attends de voir:
... delay of 2500ms
Step 1 done
... delay of 7500ms
Step 2 done
Dans les exemples fournis sur https://github.com/kriskowal/q/wiki/Examples-Gallery je ne peux pas trouver des exemples de synchrone fonctions (les fonctions qui renvoient une valeur, sans les rappels impliqués) enchaîné avec la promesse fonctions.
Toutes les idées sur la façon de mélanger dans des actions synchrones avec asynchrone promesses?
J'ai essayé:
function synchronousPromise() {
var deferred = Q.defer();
console.log( "Synchronous function call" );
deferred.resolve();
return deferred.promise;
}
delay( 2500 )
.then( function(){synchronousPromise()} )
.then( function(){delay( 7500 )} )
.then( function(){synchronousPromise()} );
Et ce sorties:
... delay of 2500ms
Time now is 2013-06-20
Time now is 2013-06-20
... delay of 7500ms
.. toujours pas ce que je suis en train de réaliser.
source d'informationauteur PP.
Vous devez vous connecter pour publier un commentaire.
Si vous voulez à la chaîne les rappels, vous devez retour une nouvelle promesse d'objet de l'un des rappels. Dans ton premier exemple, vous écrivez
ce qui signifie que vous êtes de passage à une promesse objet de
.then
pas une fonction. Selon le Promesse/Un+ proposition (Q), tous les non-arguments de la fonction doit être ignorée. Donc, fondamentalement, c'est la même que si vous venez d'écrire:Au lieu de cela, passer de la fonction qui appelle
delay
et renvoie la promesse de l'objet:Maintenant le dernier rappel ne sera appelée qu'une fois la promesse de l'objet renvoyé par
delay
dans le deuxième rappel est résolu.Google m'a amené ici, tout en travaillant par l'intermédiaire d'un problème similaire (mais l'utilisation de Kris Kowal Q), j'ai fini avec un très petit cadre qui vous permet d'effectuer les opérations suivantes:
Le cadre est à seulement 12 lignes, et peuvent probablement être adapté pour d'autres promesse de bibliothèques:
Si vous travaillez avec Babel ou Tapuscrit vous pouvez utiliser le ES6 Générateurs: