如何解决另一个承诺的承诺?

时间:2016-06-28 21:37:13

标签: javascript asynchronous twitter request promise

标题令人困惑,抱歉。

我需要查看后续承诺的承诺内容。

请参阅我之前的上下文主题:How to sequentially handle asynchronous results from API?

我下面有工作代码,我注释了我的问题:

    var promises = [];

    while (count) {
        var promise = rp(options);
        promises.push(promise);
        // BEFORE NEXT PROMISE, I NEED TO GET ID OF AN ELEMENT IN THIS PROMISE'S DATA
        // AND THEN CHANGE 'OPTIONS' 
    }

    Promise.all(promises).then(values => {
        for (var i = 0; i < values; i++) {
            for (var j = 0; j < values[i].length; j++) {
                results.push(values[i][j].text);
            }
        }
        return res.json(results);
    }, function(reason) {
        trace(reason);
        return res.send('Error');
    });

2 个答案:

答案 0 :(得分:0)

这是如何将promises链接起来的完美示例,因为then的结果是一个新的承诺。

while (count) {
    var promise = rp(options);
    promises.push(promise.then(function(result) {
        result.options = modify(result.options);  // as needed
        return result.options;
    });
}

通过这种方式,可以对Promise.all的每个承诺进行预处理。

答案 1 :(得分:0)

如果一个承诺取决于另一个承诺(例如,它可以在前一个承诺完成并提供一些数据之前执行),那么您需要链接您的承诺。没有&#34;达成承诺获取一些数据&#34;。如果您需要其结果,请使用.then()等待它。

rp(options).then(function(data) {
    // only here is the data from the first promise available 
    // that you can then launch the next promise operation using it
});

如果您尝试执行此序列count次(这是您的代码所暗示的),那么您可以创建一个包装函数并从每个promise的完成调用自己,直到达到计数为止

function run(iterations) {
     var count = 0;
     var options = {...};   // set up first options
     var results = [];      // accumulate results here

     function next() {
          return rp(options).then(function(data) {
              ++count;
              if (count < iterations) {
                  // add anything to the results array here
                  // modify options here for the next run
                  // do next iteration
                  return next();
              } else {
                  // done with iterations
                  // return any accumulated results here to become
                  // the final resolved value of the original promise
              }
          });
     }
     return next();
}

// sample usage
run(10).then(function(results) {
      // process results here
}, function(err) {
      // process error here
});