Comment promisifyAll fonctionne-t-il, ou quelles sont les exigences pour lesquelles il fonctionne?

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.