Dans une promesse, la bibliothèque bluebird a une promiscuité de fonction. Tout ou d'autres bibliothèques similaires qui prétendent convertir des fonctions asynchrones avec des motifs de rappel en termes de promesses, c'est-à-dire. resolve()
, reject()
ou done()
Comment cela fonctionne-t-il?
Par exemple:
function myAsync1 (data, url, callBack) {...}
Et si je l'ai mis dans
Promise.promisify(myAsycn1);
Alors ma fonction fonctionnera comme ça …
myAsync1('{..}', 'http://..').then(function(){...});
Cela m'a été dérangé. Existe-t-il un modèle que les bibliothèques ou les fonctions non prometteuses doivent suivre pour Bluebird promisifyAll pour les convertir en méthodes basées sur les promesses ou il existe une certaine magie qui les convertit.
Sinon, quelles sont les exigences et comment cela fonctionne-t-il avec les bibliothèques existantes comme le mongodb etc.
Existe-t-il un modèle que les bibliothèques ou les fonctions non prometteuses asynchrones doivent suivre pour Bluebird promisifyAll pour les convertir en méthodes basées sur les promesses
Oui, il y a un schéma. Les fonctions qu'il convertit doivent s'attendre à un rappel comme leur dernier argument. En outre, il doit passer une erreur en tant que premier argument du rappel ( null
si aucune erreur) et la valeur de retour comme deuxième argument.
La fonction de promiscuitation de promisify
est très difficile à suivre en raison des optimisations, donc je vais montrer une manière simple de l'écrire:
function promisify(fn) { return function() { var that = this; // save context var args = slice.call(arguments); // turn into real array return new Promise(function(resolve, reject) { var callback = function(err, ret) { // here we assume the arguments to // the callback follow node.js // conventions if(err != undefined) { reject(err); } else { resolve(ret); } }; fn.apply(that, args.concat([callback])); // Now assume that the last argument will // be used as a callback }); }; }
Maintenant, nous pourrions implémenter promisifyAll
en bouclant les fonctions dans l'objet cible et en promisify
sur chacun d'eux.
La méthode promisifyAll()
promet l'intégralité du module ou de l'objet appelé paramètre. Ce que cela signifie, c'est qu'une copie de chaque propriété de l'objet est créée avec le suffixe Async
, qui est en fait une version promisifiée de la même méthode, c'est-à-dire que vous pouvez utiliser les .then()
ou .done()
.
Par exemple, si vous avez une méthode doSomething()
dans le module someModule
, après avoir appelé Promise.promisifyAll(someModule)
une nouvelle méthode sera créée dans le module appelé doSomethingAsync()
. Vous pouvez l'utiliser de cette façon:
var someModule = require('some-module'); Promise.promisifyAll(someModule); someModule.doSomethingAsync().then(function(result) { // do whatever you want with result, this function runs after doSomthingAsync() // is finished and the returned value is stored in 'result' variable. });
Consultez la documentation de l'API bluebird pour plus d'informations.