承诺的节点模式

Node pattern for promises

本文关键字:模式 节点 承诺      更新时间:2023-09-26

我有一个节点问题。我想调用一个数据访问对象和可能的其他内部,一旦完成渲染翡翠模板

例如:

 provider1.getData(args, function(error, results) {
   /* do something with each result element */
   for(int i = 0l i < results.length; i++) {
     provider2.getData(args, function(error, items) {
        store.push(items);
     });
   }
 });
 /* Here I want to ensure that the above operations are complete */
 result.render( .... , {
   data:store
 });

基本上,我想确保在用数据呈现模板之前完成数据检索。目前,当呈现发生时,变量存储还没有被填充。我已经看了看起来很有希望的promises。有没有人有一个整洁的解决方案,将我的代码示例转换为同步结构?

这是一个承诺的答案(假设是Bluebird)。我觉得这样干净多了:

// convert to promise interface, it's possible to do this on a single method basis
// or an API basis, it depends on your case - it's also _very_ fast. 
Promise.promisifyAll(Object.getPrototypeOf(provider1.prototype)); 
Promise.promisifyAll(Object.getPrototypeOf(provider2.prototype));
//note the async suffix is added by promisification.
provider1.getDataAsync(args).then(function(results) {
   return Promise.map(results,provider2.getDataAsync.bind(provider2));
}).then(function(results){
    //results array here, everything is done and ready,
});

与承诺一样,如果您有错误,您可以简单地throw

你应该尝试使用async库。

provider1.getData(args, function(error, results) {
   /* do something with each result element */
   async.each(results,
                       function(result, cb) { // called for each item in results
                           provider2.getData(args, function(error, items) {
                                  store.push(items);
                                  cb(error);
                            });
                       },
                       // final callback
                       function (err) {
                           if (!err) {
                             /* Here I want to ensure that the above operations are complete */
                              result.render( .... , {
                                     data:store
                               });
                           }
                       }
                    );
}