Javascript 短路承诺.allSerial(),无异步等待

Javascript 短路承诺.allSerial(),无异步等待,javascript,asynchronous,es6-promise,Javascript,Asynchronous,Es6 Promise,我需要执行一系列异步任务,这样当且仅当序列中紧靠它之前的任务成功执行时,才会执行任务。我还需要收集这些任务的部分或全部结果。因此,如果第三个任务失败,我需要前两个任务的结果 现在,我可以非常轻松优雅地使用async await风格的Promissions来实现上述功能,甚至可以让它工作到令我满意的程度,但不是以下非异步await版本: 问题: 我正在处理.catch()中被拒绝的承诺,但我得到了上述警告。为什么? 平台: 节点:12.8.3 操作系统:Mac OSX 10.14.4 .catch

我需要执行一系列异步任务,这样当且仅当序列中紧靠它之前的任务成功执行时,才会执行任务。我还需要收集这些任务的部分或全部结果。因此,如果第三个任务失败,我需要前两个任务的结果

现在,我可以非常轻松优雅地使用async await风格的Promissions来实现上述功能,甚至可以让它工作到令我满意的程度,但不是以下非异步await版本:

问题:

我正在处理
.catch()
中被拒绝的承诺,但我得到了上述警告。为什么?

平台:

节点:12.8.3

操作系统:Mac OSX 10.14.4

.catch((e) => {
  throw e;
});
这不是在处理错误。。。那是扔一个

处理
p
上的错误,因为您不想处理
task
中的错误,因为这意味着被拒绝的任务后面的任务将实际运行。显然,你不想那样

//输入200失败的异步任务
功能任务(超时){
返回新承诺((解决、拒绝)=>{
log(`Starting a${timeout}ms task…`);
如果(超时==200){
log(`Starting a${timeout}ms task…失败。timeout=${timeout}`);
拒绝(`task(${timeout}):失败`);
}否则{
设置超时(()=>{
让结果=超时*10;
输出推送(结果);
log(`Starting a${timeout}ms task…done.Result:${Result}`);
解决();
},超时);
}
});
}
让输入=[40030020010050];
让输出=[];
设p=Promise.resolve();//初始化
for(设i=0;i{
返回任务(超时);
});
}
p=p
.catch(()=>{})//已处理错误!
.最后(()=>{
log(`Results至今:${output.join(“,”)}`);
});
这不是在处理错误。。。那是扔一个

处理
p
上的错误,因为您不想处理
task
中的错误,因为这意味着被拒绝的任务后面的任务将实际运行。显然,你不想那样

//输入200失败的异步任务
功能任务(超时){
返回新承诺((解决、拒绝)=>{
log(`Starting a${timeout}ms task…`);
如果(超时==200){
log(`Starting a${timeout}ms task…失败。timeout=${timeout}`);
拒绝(`task(${timeout}):失败`);
}否则{
设置超时(()=>{
让结果=超时*10;
输出推送(结果);
log(`Starting a${timeout}ms task…done.Result:${Result}`);
解决();
},超时);
}
});
}
让输入=[40030020010050];
让输出=[];
设p=Promise.resolve();//初始化
for(设i=0;i{
返回任务(超时);
});
}
p=p
.catch(()=>{})//已处理错误!
.最后(()=>{
log(`Results至今:${output.join(“,”)}`);

});
如果async Wait有效,为什么不使用它?@Liam学习
。然后()
/
.catch()
编程风格我应该使用遗留代码。这很奇怪@Harry。。。您知道async/wait before.then/.catch/.finally!!没有什么不对的。。。但是我很惊讶@JaromandaX在那里并不奇怪。
async wait
版本,即使被编译/转换成
。然后
/
.catch
为基础的版本,对于人类(像我一样,来自非承诺背景)来说,更“线性”。例如,当在基于
异步等待
的实现中发生
拒绝
时,会抛出一个异常,我可以
尝试捕获
以打破
For
-循环。这也很有用,因为在任务失败后,我甚至不需要将其余的任务链接起来。(为了论证,想象一个10K任务系列!)但是如果您尝试/最终(没有捕获),您也不会捕获任何错误,并且会抛出一个错误,不是吗?所以这是一样的-如果你想捕获一个错误,你可以使用catch/.catch为什么你不想使用async wait,如果它工作的话?@Liam学习
。然后()
/
.catch()
编程风格我应该运行遗留代码吗?这很奇怪@Harry。。。您知道async/wait before.then/.catch/.finally!!没有什么不对的。。。但是我很惊讶@JaromandaX在那里并不奇怪。
async wait
版本,即使被编译/转换成
。然后
/
.catch
为基础的版本,对于人类(像我一样,来自非承诺背景)来说,更“线性”。例如,当在基于
异步等待
的实现中发生
拒绝
时,会抛出一个异常,我可以
尝试捕获
以打破
For
-循环。这也很有用,因为在任务失败后,我甚至不需要将其余的任务链接起来。(为了论证,想象一个10K任务系列!)但是如果您尝试/最终(没有捕获),您也不会捕获任何错误,并且会抛出一个错误,不是吗?所以这是一样的-如果您想捕获错误,可以使用catch/.catch
Starting a 400ms task... 
Starting a 400ms task... done. Result: 4000
Starting a 300ms task... 
Starting a 300ms task... done. Result: 3000
Starting a 200ms task... 
Starting a 200ms task... FAILED. timeout = 200
Results so far: 4000, 3000
(node:1882) UnhandledPromiseRejectionWarning: task(200): FAILED
(node:1882) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 3)
(node:1882) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
.catch((e) => {
  throw e;
});