Javascript 异步函数内的中断承诺执行-JS
我有下一个异步函数:Javascript 异步函数内的中断承诺执行-JS,javascript,Javascript,我有下一个异步函数: private _activateProgressBar(): void { (async () => { await this.check(1000); await this.check(3000); await this.check(5000); this.modalClose('success'); })(); } 在我的check函数中,我想检查一些条件,并根据这
private _activateProgressBar(): void {
(async () => {
await this.check(1000);
await this.check(3000);
await this.check(5000);
this.modalClose('success');
})();
}
在我的check
函数中,我想检查一些条件,并根据这些条件决定是否在某个时间后继续执行下一个承诺或停止执行:
check(ms: number): Promise<any> {
return new Promise((resolve, reject) => {
if (this.condtion) {
return setTimeout(resolve, ms);
} else {
reject();
}
}).catch(null);
}
支票(ms:号码):承诺{
返回新承诺((解决、拒绝)=>{
如果(本条件){
返回setTimeout(解析,毫秒);
}否则{
拒绝();
}
}).catch(空);
}
正如您在这里看到的,我返回Promise.reject()
,但显然这并不能阻止移动到下一个Promise
在这种情况下,如何停止下一个
Promise
的进程并停止序列?从回调返回的值传递给Promise
构造函数与此无关
这意味着,创建第二个但被拒绝的承诺,然后返回它是毫无意义的。它将被丢弃
如果要拒绝承诺,请调用它提供的reject
函数
return new Promise((resolve, reject) => {
^^^^^^
一种可能的解决方案是从
check
方法返回一些布尔值,根据返回值,您可以决定是否要进一步执行
check(ms: number): Promise<any> {
return new Promise((resolve, reject) => {
if (this.condtion) {
return setTimeout(() => {
resolve(true);
}, ms);
} else {
resole(false);
}
}).catch(null);
}
private _activateProgressBar(): void {
(async () => {
let proceed = true;
if(proceed) {
proceed = await this.check(1000);
}
if(proceed) {
proceed = await this.check(3000);
}
if(proceed) {
proceed = await this.check(5000);
}
this.modalClose('success');
})();
}
支票(ms:号码):承诺{
返回新承诺((解决、拒绝)=>{
如果(本条件){
返回setTimeout(()=>{
决心(正确);
},ms);
}否则{
可分辨(假);
}
}).catch(空);
}
private _activateProgressBar():void{
(异步()=>{
让我们继续下去=真;
如果(继续){
继续=等待。检查(1000);
}
如果(继续){
继续=等待。检查(3000);
}
如果(继续){
继续=等待。检查(5000);
}
这是modalClose(“成功”);
})();
}
这只是一个简单的例子,您可以使它更通用和优化。只是尝试重用您的代码。如果您在所有
等待
周围添加一个try/catch
块,第一个失败的将停止执行并被捕获到catch
。简单地拒绝()
承诺
(async () => {
try {
await this.check(1000);
await this.check(3000); // If this one fails...
await this.check(5000); // ...this one won't be reached...
this.modalClose('success'); // ...this won't be triggered...
} catch (err) {
console.log("One of them failed") // and you'll get here instead.
}
})();
check(ms: number): Promise<any> {
return new Promise((resolve, reject) => {
if (this.condtion) {
return setTimeout(resolve, ms);
} else {
reject();
}
})
}
不要返回
Promise.reject()
,调用reject
函数。您可以从check
方法返回一些布尔值,然后使用返回值,您可以决定是继续还是跳过。类似的情况?因为它没有停止它check(ms:number):Promise{if(!this.condition){return new Promise((resolve,reject)=>{return reject();};}return new Promise((resolve)=>{return setTimeout(resolve,ms);}}