标题令人困惑,抱歉。
我需要查看后续承诺的承诺内容。
请参阅我之前的上下文主题: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');
});
答案 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
});