承诺只是回归?

时间:2017-11-28 14:14:24

标签: typescript promise

我注意到我正在使用的代码库中有以下内容,我不确定它的含义是什么:

public spinnerPromise: Promise<void> = new Promise<void>(() => { return; });

有没有理由拥有空的承诺?这让我想起了 setTimeOut(fn, 0)我想知道它是否有类似的效果。

由于

2 个答案:

答案 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传递给setTimeoutdoesn't really work in reality)。

您可能会想到Promise.resolve().then(…)new Promise(r => r()).then(…),它会立即调用回调函数但是异步调用。