Javascript 为什么要使用Promise.resolve().then()?

Javascript 为什么要使用Promise.resolve().then()?,javascript,angular,Javascript,Angular,在阅读Angular的指令代码时,我发现了Promise.resolve的一个奇怪用法: private update():void{ ... Promise.resolve()然后(()=>{ const hasActiveLinks=this.hasActiveLinks(); if(this.isActive!==hasActiveLinks){ ... } }); } 在这种情况下,使用Promise.resolve().then()而不是只执行then中的代码是否有用 我看到过set

在阅读Angular的指令代码时,我发现了
Promise.resolve的一个奇怪用法:

private update():void{
...
Promise.resolve()然后(()=>{
const hasActiveLinks=this.hasActiveLinks();
if(this.isActive!==hasActiveLinks){
...
}
});
}
在这种情况下,使用
Promise.resolve().then()
而不是只执行
then
中的代码是否有用


我看到过
setTimeout(()=>defeferedFunction())
的用法,但第一次看到它时使用了
Promise.resolve

如果您希望函数返回一个承诺,但您只有条件地运行包含承诺的代码,您可能需要使用此模式

或者,只需使用
async/await
语法即可

例如,如果您有一个获取数据的函数,但是数据可能被缓存,那么您可以执行以下操作

函数fetchData(){
返回Promise.resolve().then(函数()){
if(cache&&cache.data)返回cache.data;
//如果我们在这里,数据不会被缓存。
返回database.getData();
})

}
简单来说,在then handler函数中:

A) 当x是一个值(数字、字符串等)时:

退货x
相当于
退货承诺。解决(x)
throw x
相当于
退货承诺。拒绝(x)

B) 当x是一个已经解决(不再未决)的承诺时:

return x
相当于
return Promise.resolve(x)
,前提是承诺已得到解决。
退货x
相当于
退货承诺。如果承诺已被拒绝,则拒绝(x)

C) 当x是待定的承诺时:


return x
将返回一个待定的承诺,并将在随后的测试中对其进行评估。

Angular框架经常这样做。它用于防止您经常看到的错误(抱歉,不知道错误的实际措辞),例如“检查后值已更改”。如果更改检测器检查一个值,然后在同一周期内更改,则会发生此错误


resolve()将此代码推送到微任务队列,以便在JavaScript堆栈为空后执行。这可以防止错误。

它可能与
setTimeout(()=>defeferedFunction())
相同,但只使用一个承诺(以及微任务队列)。然而,我不确定是否真的有可能确切地说出为什么在那里使用它。可能是个错误,也可能是故意的。它可能是故意的,但出于某种原因被误导了。请注意Angular为这类问题设置了一个框架,普通人可以猜测(就像现有的框架一样),但最好从编写它的人那里得到答案。OP询问的代码中没有
return
。虽然您总体上是正确的(这可能是
Promise.resolve()
)的用例),但这不是原因。此外,OPs代码是typescript,在方法定义上有
:void
,因此他们明确表示根本不应该有返回。OPs代码省略了很多内容。例如,如果函数的后一部分期望函数的前一部分提供承诺,但函数的前一部分可能有条件地使用同步或异步代码,那么我的答案的原则仍然适用。这很难说,因为他给了我们很少的东西看。我不确定这个解释对问题中的代码有什么帮助。特别是因为我们不知道代码在做什么。这很有意义,谢谢!