在下面的代码中,我注意到在调用getProm()的那一刻,承诺开始得到解决(我注意到运行代码时延迟了5秒)。
我想确认承诺是在创建时立即解决还是仅在以下2种情况下解决。 1)只有当我们明确地做Promise.resolve时才会解决承诺2)我们使用.then关键字
function getProm(){
var prom1 = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve("Promise is resolved")
},5000)
})
return prom1
}
var mypromise = getProm()
答案 0 :(得分:1)
有三个时刻需要区分:
调用回调的那一刻,你传递给new Promise
:所谓的promise构造函数回调。这是立即的:它将在new Promise
表达式之后的任何其他代码之前执行。在您的情况下,这意味着setTimeout
会立即执行。
承诺解决的那一刻。当调用提供给promise构造函数回调的resolve
或reject
函数时,会发生这种情况。在你的情况下,这发生在延迟5秒后。
检测已解决的承诺。这总是异步发生:使用ES6承诺无法检测到promise已同步解决,即使代码无延迟地调用resolve
。您使用then
回调(或await
)检测分辨率。在当前调用堆栈运行完成并清空之前,不会调用此回调。无论您是否检测到此类分辨率,这都不会延迟承诺的实际解决方案。如果你在延迟10分钟后执行then
,它将在下一个微任务中触发then
回调,即使承诺早已解决了。您可以对同一个承诺进行多次then
次呼叫:它们都会触发回调。