setInterval并等待某些条件

时间:2017-08-14 13:36:30

标签: node.js

我想要做的事情在节点js中可能是不可能的,但在我放弃之前我想得到其他意见。

我有一个正在执行产品设置的线程。为了论证,我们称之为“主”线程。我希望产品设置期间可能发生的所有错误都被“主”线程捕获。如果设置成功,那么在我知道设置成功之前,我不希望'main'线程完成。

产品设置过程中的一个步骤是在客户的AWS账户中创建CloudFormation堆栈。执行此操作的AWS功能是createStack。此功能仅从创建堆栈的过程开始。如果使用await调用此函数,则在获得返回值后,仍将运行创建堆栈的过程。

还有另一个名为describeStacks的AWS CloudFormation函数,我可以用它来了解创建的进展情况。我无法重复调用此方法(不使用调用之间的大间隔),因为AWS限制了我调用方法的频率。

我希望能够每分钟调用一次此函数来检查堆栈创建的进度,直到我可以确定设置是成功还是失败。但至关重要的是,我还希望“主”线程等到这个成功或失败发生。

这在节点js中是否可行?我是节点js的新手。请随意告诉我,我在滥用它,我正在以错误的方式思考问题。我怀疑我是。

解决方案:这是为我解决问题的代码。感谢Tomalak

function checkStackCreationProgress(params) {
    return new Promise( (resolve, reject) => {
        const intervalId = setInterval( async () => {
            try {
                const result = await checkProgress(params);

                switch(result.status) {
                    case 'IN_PROGRESS': break; //do nothing
                    case 'COMPLETE': clearInterval(intervalId); resolve(result); break;
                    case 'FAILED': clearInterval(intervalId); reject(result); break;
                }
            }
            catch(error) {
                clearInterval(intervalId);
                reject(error);
            }
        },
        60000);
    })
    .then( () => {
        return;
    })
    .catch(error => {
        throw new SetupFailedError(`Failed to create ...`, error);
    });
}

在设置成功完成或失败之前,此功能不会返回

1 个答案:

答案 0 :(得分:2)

  

如果使用await调用此函数,则在获得返回值后,创建堆栈的过程仍将继续运行。

不要用await来调用它,这会阻塞线程。

异步函数返回Promises,您可以链接它们并在此期间执行其他操作。

所以而不是

try {
    var result = await createStack({some: params));
    // work with result
} catch (ex) {
    // handle error
}

DO

createStack({some: params)).then(function (result) {
    // work with result
}).catch(function (error) {
    // handle error
});

第二种形式是非阻塞的,你可以在此期间做任何工作。例如:

var checking = setInterval(function () {
    // check/output for the stack status...
}, 60000)

createStack({some: params)).then(function (result) {
    clearInterval(checking);

    // work with result
}).catch(function (error) {
    clearInterval(checking);

    // handle error
});

console.log("Stack is being created, hang on...");