异步步骤,等待所有步骤成功或失败
问题描述:
我有一个服务器端Node.JS脚本来处理文件上传(1)将上传保存到特定位置和(2)将其记录在数据库中。我一直在使用Asynquence库和它的门函数(相当于Promise.all)来并行执行这些步骤,但是我需要序列的行为,以便如果任一步失败,如果成功,则撤销另一步。显然,撤销步骤只有在其匹配步骤已经成功时才会执行(即删除文件或db记录)异步步骤,等待所有步骤成功或失败
Gate似乎不适用于这种情况,因为如果任何步骤失败,它将触发错误处理程序。有没有等待所有步骤成功或失败的函数?
答
如果您认为catch
作为异步对口try
,那么你可以建立一个快速的包装,包装传递给gate
或Promise.all
每一个值,并返回一个“成功”或“失败”的结果。
function waitForAll(inputArray) {
// Return Promise.all on an array where for each array value...
return Promise.all(inputArray.map(function(x)
// ...we wrap it in a tiny dict with the semantics we want.
return Promise.resolve(x).then(function(value) {
return { success: true, value: value };
}, function(error) {
return { success: false, error: error };
});
}));
}
作为奖励,因为你可以把每个承诺任何行动,你的包装,你甚至可以通过一个单独的渠道迅速及时报告故障,或者立即开始取消或回滚成功的行动为任何异步步骤失败。
除了表现,你会发现按顺序进行两个阶段会更简单。因此,如果第一阶段失败了,则不需要撤销任何东西;如果第二阶段失败了,只有第一阶段需要撤消。 –