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的浏览器中构成开放式内存泄漏
此代码是否包含反模式?如果是这样的话,我如何在不引入内存泄漏的情况下修复它

具体请参见第10行:
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