requestReport()
.then(getReportData)
.then(checkReportStatus)
.then(handleData)
checkReportStatus = (data) => {
return new Promise((resolve, reject) => {
if(data.status === 'completed')
resolve(data)
else {
setTimeout(() => getReportData(), 1000)
}
因此,我首先提出报告请求,然后需要检查是否生成了报告(状态将变为已完成)。如果尚未完成,则需要再次调用getReportData。但是我真的对承诺感到困惑。我的代码实际上有很多行,大约有15条链接。如果报告未完成,那么拨打电话的正确方法是什么,以便报告完成后才可以从handleData继续?
edit1:错字
答案 0 :(得分:0)
如果getReportData()
返回的承诺可以解决数据(它出现在您的.then()
链中)并且不需要来自requestReport()
的任何输入参数,那么您可以做到这一点:
// utility function that returns a promise that resolves after a delay
// useful for inserting a delay into a promise chain
function delay(t) {
return new Promise(function(resolve) {
setTimeout(resolve, t);
});
}
requestReport()
.then(getReportData)
.then(checkReportStatus)
.then(handleData)
function checkReportStatus(data) {
if (data.status === 'completed') {
return data;
} else {
// retry after a delay
// add retry promise to the current promise chain
return delay(1000).then(getReportData);
}
}
如果您需要将requestReport()
的结果作为getReportData()
的参数,则将已将该信息传递到Promise链中,以便对getReportData()
的重试可以使用它。您必须向我们显示更多详细信息(requestReport()
返回的数据是什么,getReportData()
需要什么数据)才能对如何做到最好提出具体建议。
答案 1 :(得分:-1)
checkReportStatus (data) => {
if (data.status === 'completed') {
return data;
} else {
// retry after a delay
delay(1000).then(checkReportStatus(data));
}
}
尝试调用checkReportStatus(data)。