【发布时间】:2023-03-23 17:04:01
【问题描述】:
假设我有三个异步函数:
functionPromise1, functionPromise2, functionPromise3
我希望同时调用所有三个,详细信息如下:
- 如果
functionPromise1被拒绝,则停止其他两个函数 整理。 - 如果
functionPromise2和functionPromise3都完成并已解决,请继续执行下一部分代码,但如果functionPromise1最终被拒绝,则不要继续深入代码。 - 如果
functionPromise2或functionPromise3被拒绝,请不要继续执行下一部分代码。
我对这些函数的用例是 functionPromise1 用作输入验证,我希望与其他将输入视为已验证的函数同步,以加快我的流程。但是,如果 functionPromise1 在任何时候发现输入无效,我想终止代码。
function functionPromise2(...){
return new Promise(function(resolve,reject){
fetchUrl(url, function(err, meta, body){
if (err) { reject(err); } else {
if (body.toString().indexOf(text) !== -1){
resolve();
} else {
reject("Could not find quote");
}
}
});
});
}
function functionPromise3(...) {
return new Promise(function(resolve,reject){
var id = shortid.generate();
var fileName = id+'.png';
webshot(url, fileName, { shotOffset: {left: mouseX, top: mouseY} }, function(err) {
if (err) { reject(err); } else {
resolve({id: id, fileName: fileName});
}
});
});
}
【问题讨论】:
-
当您说“同步”时,您的意思可能是“并发”吗?因为否则这个问题就没有意义了。
-
@john_omalley 我的意思是并发。我假设它们是同义词。我马上改
-
@mhodges 这不是说它们会异步运行吗?
-
简短的回答是你不能。如果您希望调用 2 和 3 依赖于 1 解析,则在 1 完成之前不能调用它们。 JavaScript 具有 run-to-completion 函数语义,您不能在函数运行时取消函数调用,无论它是否在 Promise 中。您可以轻松完成其余的工作。
-
Promise 不能被“停止”,如果您正在执行任何可以停止的处理,则需要手动执行。请告诉我们您的
functionPromise2和functionPromise3在做什么。
标签: javascript promise race-condition