承诺在错误Node.js中进行递归调用

时间:2018-07-07 16:52:15

标签: javascript node.js promise

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:错字

2 个答案:

答案 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)。