我正在努力处理以下相对简单的代码:
return Promise.all(promises)
.then(results => {
results.forEach(element => {
var mainKey = element.key;
var mainValue = element.val();
if(mainKey.toString().startsWith('us_', 0)) {
text = text + '\n\nUser id : ' + mainKey + '\n';
Object.keys(mainValue).forEach(function(key) {
text = text + mainValue[key];
});
}
if(mainKey.toString().startsWith("cr_", 0)) {
text = text + 'Creation id: ' + mainKey;
Object.keys(mainValue).forEach(function(key) {
console.log(key, mainValue[key]);
text = text + mainValue[key];
});
const file = bucket.file(value["thumbnail"]);
//START of another level of async code
var url = file.getSignedUrl({
action: 'read',
expires: '03-09-2491'
}).then(signedUrls => {
text = text + 'URL: ' + signedUrls[0];
return text;
});
//END of another level of async code
}
});
return sendMail(orderid, text);
}).catch((error) => {
console.log("sendMail failed : "+ error);
});
使用Promises.all()执行了一些异步请求(批处理A)。到目前为止,它可以按预期工作:所有的诺言都成功执行,并返回应有的结果。现在,我需要添加另一层异步请求(批处理B),该请求将批处理A中的数据用作参数。因此,据我了解,应该是批处理A中“然后”块中的另一个Promise.all()调用。
我的理解正确吗,或者有更简单的方法来实现?您能否提供上述代码示例演示解决方案?
答案 0 :(得分:1)
是的,您基本上是正确的。
then
子句允许您运行使用异步调用结果的代码。然后,您可以运行更多异步调用并返回这些承诺。
使代码美观的诀窍是,当您在then
子句中返回诺言时,下一个then
的结果将是该诺言的结果。换句话说,诺言变平了-您不再有价值承诺,而是再次有了价值承诺。
Promise.all(promiseList)
.then(results => Promise.all(createNewPromises(results)))
.then(moreResults => doStuffWithMoreResults(moreResults))
.catch(err => somethingBadHappened(err))