Javascript 承诺中的异步代码总是反模式吗?
我从中看出,将Javascript 承诺中的异步代码总是反模式吗?,javascript,es6-promise,anti-patterns,non-recursive,Javascript,Es6 Promise,Anti Patterns,Non Recursive,我从中看出,将Promises与async代码混合使用可能是一种反模式 然而,这是否适用于所有情况 我无法找到一种简单的方法来避免在以下代码中组合它们: 它是setInterval的一种替代方法,它在安排下一次调用之前等待调用完成 然而,与之不同的是,它并不会在导致TCO的浏览器中构成开放式内存泄漏 此代码是否包含反模式?如果是这样的话,我如何在不引入内存泄漏的情况下修复它 具体请参见第10行:newpromise(异步(解析)=>{ -这似乎很不习惯,但我看不到另一种实现方法:在while
Promise
s与async
代码混合使用可能是一种反模式
然而,这是否适用于所有情况
我无法找到一种简单的方法来避免在以下代码中组合它们:
- 它是
的一种替代方法,它在安排下一次调用之前等待调用完成setInterval
- 然而,与之不同的是,它并不会在导致TCO的浏览器中构成开放式内存泄漏
newpromise(异步(解析)=>{
-这似乎很不习惯,但我看不到另一种实现方法:在while
循环中包装wait
语句,分派它,并返回句柄以中止循环
var[setRepeatedTimeout,clearRepeatedTimeout]=(()=>{
const sleep=(delay)=>新承诺(resolve=>setTimeout(resolve,delay));
常量repeatedTimeoutIntervals=[];
函数setRepeatedTimeout(f,delay,…参数){
//与setInterval类似,但在安排下一个调用之前,会等待调用完成
//(支持经典和异步函数)
const mySemaphores={notAborted:true};
const intervalID=repeatedTimeoutIntervals.push(mySemaphores)-1;
新承诺(异步(解析)=>{
等待睡眠(延迟);
while(mySemaphores.notAborted){
等待f(…参数);
等待睡眠(延迟);
}
删除repeatedTimeoutIntervals[intervalID];
});
返回有效期;
}
函数clearRepeatedTimeout(有效期内){
//清除setInterval()设置的循环
repeatedTimeoutIntervals[intervalID].notAborted=false;
}
返回[setRepeatedTimeout,clearRepeatedTimeout];
})();
创建计时器
清除计时器
另一个问题是警告的问题,这可能是一个问题,如果传递给承诺构造函数的异步回调内部等待拒绝的内容,承诺将挂起而不是拒绝。您当前的代码不会导致f
永远拒绝,而是setRepeatedTimeout
如果执行一项可能会拒绝的任务,您将得到未经处理的拒绝和永久挂起:
var[setRepeatedTimeout,clearRepeatedTimeout]=(()=>{
const sleep=(delay)=>新承诺(resolve=>setTimeout(resolve,delay));
常量repeatedTimeoutIntervals=[];
函数setRepeatedTimeout(f,delay,…参数){
//与setInterval类似,但在安排下一个调用之前,会等待调用完成
//(支持经典和异步函数)
const mySemaphores={notAborted:true};
const intervalID=repeatedTimeoutIntervals.push(mySemaphores)-1;
新承诺(异步(解析)=>{
等待睡眠(延迟);
while(mySemaphores.notAborted){
等待f(…参数);
等待睡眠(延迟);
}
删除repeatedTimeoutIntervals[intervalID];
});
返回有效期;
}
函数clearRepeatedTimeout(有效期内){
//清除setInterval()设置的循环
repeatedTimeoutIntervals[intervalID].notAborted=false;
}
返回[setRepeatedTimeout,clearRepeatedTimeout];
})();
常量{intervalID:undefined};
_.intervalID=setRepeatedTimeout(()=>{
console.log('Throwing…');
返回承诺。拒绝();
}, 2000)
另一个问题是警告的问题,这可能是一个问题,如果传递给承诺构造函数的异步回调的内部等待拒绝的内容,承诺将挂起而不是拒绝。您当前的代码不会导致f
拒绝,而是setRepeatedTimeout代码>如果执行可能拒绝的任务,您将得到未经处理的拒绝和永久挂起:
var[setRepeatedTimeout,clearRepeatedTimeout]=(()=>{
const sleep=(delay)=>新承诺(resolve=>setTimeout(resolve,delay));
常量repeatedTimeoutIntervals=[];
函数setRepeatedTimeout(f,delay,…参数){
//与setInterval类似,但在安排下一个调用之前,会等待调用完成
//(支持经典和异步函数)
const mySemaphores={notAborted:true};
const intervalID=repeatedTimeoutIntervals.push(mySemaphores)-1;
新承诺(异步(解析)=>{
等待睡眠(延迟);
while(mySemaphores.notAborted){
等待f(…参数);
等待睡眠(延迟);
}
删除repeatedTimeoutIntervals[intervalID];
});
返回有效期;
}
函数clearRepeatedTimeout(有效期内){
//清除setInterval()设置的循环
repeatedTimeoutIntervals[intervalID].notAborted=false;
}
返回[setRepeatedTimeout,clearRepeatedTimeout];
})();
常量{intervalID:undefined};
_.intervalID=setRepeatedTimeout(()=>{
console.log('Throwing…');
返回承诺。拒绝();
}(2000)哇,把最后一段放在最后让我对整个阅读感到好奇“但是他们看到这个承诺构造函数做了什么,我看不到我自己?”啊,谢谢-只使用异步IIFE
哇,把最后一段放在最后让我对整个阅读感到好奇“但是他们看到这个承诺构造函数做了什么,我看不到我自己?”啊,谢谢-只使用异步IIFE