【发布时间】:2017-11-07 03:40:00
【问题描述】:
场景
我有一组需要下载的 URL,但是还必须为每个 URL 提供一个唯一的事务 ID,该事务 ID 必须从服务器请求,并且仅在请求成功时递增。
问题
当我循环遍历数组时,我需要等待事务 ID 请求和文件请求完成,然后再开始循环的下一次迭代,但文件数不固定,因此需要动态构建一连串的承诺。
伪代码
下面是一些伪代码,getFiles() 是问题所在,因为所有请求都获得相同的事务 ID,因为它们不等待前一个请求完成。
function getTransationId(){
return new Promise((resolve,reject)=> {
let id = getNextTransactionId();
if(id!=error){
resolve(id);
}else{
reject(error);
}
})
}
function getFile(url, transactionId){
return new Promise((resolve,reject)=>{
http.request(url+transactionId, function(err,response){
if(err){
reject(err);
}else{
resolve(response);
}
});
});
}
function getFilesFromArray(urlArray){
for(let url of urlArray){
getTransactionId().then(resolve=>getFile(url,resolve),reject=>console.error(reject));
}
}
问题
如何动态地将 Promise 链接在一起?
回答
【问题讨论】:
-
如果
getNextTransactionId返回id,为什么需要将它包装在Promise 中?然后,您的示例将与未定义的error进行比较。如果不知道getNextTransactionId返回的是什么,很难判断是什么导致了问题。 -
getTransactionId()是对服务器的调用,因此我们需要在继续之前等待响应,否则 Id 将是undefined。就错误而言,我已经过度简化了说明问题的过程,因此调用是伪代码。
标签: javascript node.js ecmascript-6 promise es6-promise