我注意到我正在使用的代码库中有以下内容,我不确定它的含义是什么:
public spinnerPromise: Promise<void> = new Promise<void>(() => { return; });
有没有理由拥有空的承诺?这让我想起了
setTimeOut(fn, 0)
我想知道它是否有类似的效果。
由于
答案 0 :(得分:4)
修改强>
正如@Bergi指出的那样,给定的承诺永远不会实现,因为没有人会呼叫解决。因此,有问题的承诺绝不会让任何人等待结果。
相当于setTimeOut(fn, 0)
的承诺是:
var spinnerPromise: Promise<void> = new Promise<void>(resolve => resolve());
<强>原始强>
是的,效果类似。 Promise
specification强制要求即使Promise
处于履行状态,也不会在处理程序注册时调用任何处理程序。只有在当前调用完成后才会调用它。
spinnerPromise.then (()=> { /* Code called later */ });
// Code called after call to then
答案 1 :(得分:3)
是否有理由拥有空的承诺?
我想不到很多。一个用例可以作为一个值传递给Promise.race
并期望它总是采取其他选择。
查看Are JavaScript forever-pending promises bad?和Is it safe to not resolve or reject a promise。
这让我想起了
setTimeOut(fn, 0)
,我想知道它是否有类似的效果。
不,一点也不。 setTimeout
最终将调用回调,但new Promise(() => {}).then(…)
永远不会。它更类似于将Infinity
传递给setTimeout
(doesn't really work in reality)。
您可能会想到Promise.resolve().then(…)
或new Promise(r => r()).then(…)
,它会立即调用回调函数但是异步调用。