【问题标题】:resolving a promise in a loop在循环中解决一个承诺
【发布时间】:2016-10-19 20:00:55
【问题描述】:

我在如何解决链式 Promise 并将数据传回时遇到问题。我正在使用带有请求承诺的节点 js。这是我的代码

start(name)
   .then(firstFunction)
   .then(secondFuntion)
   .then(function(){
       // i want to return data from secondfunction  back  
   ))

问题在于 secondFunction 我有一个 for 循环,它对我从 firstFunction 获得的每个对象执行调用,它是一个对象数组。我是在每次迭代后还是在所有迭代后解决承诺。创建一个全局对象并将结果保存到其中并返回该结果会更聪明吗?我的 secondFunction 代码如下所示

var secondFunction = function(data){
    var promise = new Promise(function(){
        for(var i= 0; i <data.length; i ++){
            options = { url: "", jason: true}
            rp.(options)
              .then(function(resp){
                // i do something with respose and need to save this 
               //should i resolve the promise here??
              })
              .catch(function(err){
              });
        }
    });
    return promise;
}

编辑

我想通了!感谢所有帮助,在我的第二个函数中,我做到了这一点

var task = function(item){
     // performed the task in here
}

var actions = data.map(task);
return Promise.all(actions);

【问题讨论】:

    标签: javascript angularjs node.js promise


    【解决方案1】:

    对数组中的每个项目执行异步操作的正常模式是将操作转换为返回 Promise 的函数,然后使用 [].map() 将值数组映射到 Promise 数组。然后,您使用Promise.all(),它接受一个 Promise 数组,并返回一个用值数组解析的单个 Promise,当原始数组中的所有 Promise 都被解析时。它看起来像这样:

    var secondFunction = function(data) {
      var promisesArray = data.map(rp);
      return Promise.all(promisesArray);
    }
    

    您的第三个.then() 将具有一组值,这些值是通过对data 中的每个项目应用rp 解决的,按照它们在data 中出现的顺序。

    带有一些 ES6 糖的较短版本是:

    const secondFunction = data => Promise.all(data.map(rp));
    

    如果您使用的是 Bluebird,它是事实上的服务端 JS 承诺库,您可以使用简写 Promise.map(),它接受一个数组和一个映射函数,并且执行相同的操作:

    const secondFunction = data => Promise.map(data, rp);
    

    【讨论】:

    • 非常感谢!!我用了你的建议
    猜你喜欢
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多