我想要做的事情在节点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);
});
}
在设置成功完成或失败之前,此功能不会返回
答案 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...");