【发布时间】:2017-08-14 13:36:30
【问题描述】:
我想做的事情在node js中可能做不到,但在我放弃之前我想得到其他意见。
我有一个正在执行产品设置的线程。为了论证起见,让我们称其为“主”线程。我希望在产品设置期间可能发生的所有错误都被“主”线程捕获。如果设置成功,那么我不希望“主”线程在我知道设置成功之前完成。
产品设置过程中的一个步骤涉及在客户的 AWS 账户中创建 CloudFormation 堆栈。执行此操作的 AWS 函数是 createStack。这个函数只是开始创建堆栈的过程。如果你使用 await 调用这个函数,那么创建堆栈的过程在你得到返回值后仍然会运行。
还有另一个名为 describeStacks 的 AWS CloudFormation 函数,我可以使用它来了解创建的进展情况。我不能重复调用这个方法(在调用之间不使用很大的间隔),因为 AWS 对我调用方法的频率有限制。
我希望能够每分钟调用一次此函数来检查堆栈创建的进度,直到我可以确定设置成功或失败。但至关重要的是,我还希望“主”线程等到成功或失败发生。
这在节点 js 中可能吗?我是节点 js 的新手。请随时告诉我我在滥用它并且我以错误的方式思考问题。我怀疑我是。
解决方案:这是为我解决问题的代码。感谢托马拉克
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);
});
}
在设置成功或失败之前,该函数不会返回
【问题讨论】:
标签: node.js