Javascript 如何使用此特定接口创建setTimeoutAsync?

Javascript 如何使用此特定接口创建setTimeoutAsync?,javascript,promise,Javascript,Promise,这不是类似问题的重复 相反,我希望API或接口按如下方式工作: setTimeoutAsync(1000).then(()=>{ console.log('1 second passed'); }); 根据我的理解,我想使用new Promise(),这是构造函数的主要用途: new Promise((resolve, reject)=>{ }) 和setTimeout() 我想你想要这样的东西: function setTimeoutAsync(interval, valu

这不是类似问题的重复

相反,我希望API或接口按如下方式工作:

setTimeoutAsync(1000).then(()=>{
  console.log('1 second passed');
});
根据我的理解,我想使用new Promise(),这是构造函数的主要用途:

new Promise((resolve, reject)=>{
})
和setTimeout()


我想你想要这样的东西:

function setTimeoutAsync(interval, value) {
  return new Promise(resolve => setTimeout(resolve, interval, value));
}
用法:

setTimeoutAsync(1000).then(() => console.log('1 second passed'));
// or with an argument
setTimeoutAsync(1000, 1).then(n => console.log(`${n} second passed`));
或使用异步/等待:

async function main() {
  const n = await setTimeoutAsync(1000, 1);
  console.log(`${n} second passed`);
}
此解决方案仅限于1个值参数,因为
resolve
仅接受1个参数,并且您无法从setTimeout检索句柄以在需要时清除它。感谢@PatrickRoberts指出这一点


如果您需要1个以上的值参数,我建议您传递一个包含值的数组或一个包含键值对的对象。

其他问题中提出的所有代码片段完全符合您的要求?请在您的问题中包含您认为重复的内容不适用于您的问题的原因。为了澄清@Jonaswillms的评论,该问题的答案涉及OP希望在承诺链接中以特定方式使用包装超时,但OP版本的
promiseTimeout
具有您在该问题中指定的确切接口。重申一下:dupe目标中的第一个片段是一个具有您想要的确切接口的包装超时。更好的dupe目标可能是因为该问题的答案很好地回答了这个问题。我不知道为什么这个问题被标记为承诺链问题的重复,这是非常误导的。@J.M.是的,我想澄清的是,第一个重复的问题文本中的第一个片段,以及第二个重复的顶部答案都包含一个与这里回答的几乎相同的函数,两者都是对上述问题的完美回答。实际上,两个函数都没有传递参数,但公平地说,这是一个额外的细节,当时还不知道。或者
如果在
async
函数中,则等待setTimeoutAsync(1000)
。@NikKyriakides这是一个很好的建议。我假设这个问题不是dup,所以我很快就回答了。@J.M.仅供参考,
resolve()
最多只接受一个参数,所以rest参数看起来很傻。我建议使用类似于
函数setTimeoutAsync(delay,value=undefined){returnnewpromise(resolve=>{setTimeout(resolve,delay,value);}}}
的方法来取消,您可以像这样对Promise实例进行monkeypatch:
函数setTimeoutAsync(delay,value){let timeout;return Object.assign(newpromise(resolve=>{timeout=setTimeout(resolve,delay,value);}),{cancel(){cleartimout(timeout);}}}
,但基于问题的性质,我认为这甚至不是一个问题,我也不建议创建永远无法解决的承诺,因为这通常是代码味道,可能会在遵循这一基本承诺的更高级别承诺链中导致混乱或意外行为。回顾im的暴行不过,在我最后的评论中,我倾向于说这是一个未能分离关注点的问题。为了取消,我建议使用一个完全独立(且可组合)的API,类似于C#的
TaskCompletionSource
class PromiseComletionSource{constructor(){this.promise=new promise((解析,拒绝)=>{this.resolve=resolve;this.reject=reject;});}
然后在当前实现中,
var pcs=new PromiseCompletionSource();pcs.promise.then(console.log,console.error);setTimeoutAsync(1000,1)。然后(pcs.resolve);
so
pcs.reject()
取消。
async function main() {
  const n = await setTimeoutAsync(1000, 1);
  console.log(`${n} second passed`);
}