2016-12-01 93 views
1

我有一個代碼段https://jsfiddle.net/h3m10005/使用的setTimeout解決或拒絕一個承諾

let p = new Promise((resolve, reject) =>{ 
    setTimeout(()=>reject('error'), 5000); 
}); 

p.then(null,(err)=>{ 
    console.log(err); 
}); 

當上述代碼部分被執行,在大約5秒我將看到error打印。但是,如果我不包裝函數中的reject()調用,則控制檯立即輸出error。例如,

let p = new Promise((resolve, reject) =>{ 
     setTimeout(reject('error'), 5000); 
}); 

p.then(null,(err)=>{ 
     console.log(err); 
}); 

任何想法,爲什麼這可能是這種情況?謝謝。

回答

3

這是因爲在你的第二個例子中,你立即調用它。

setTimeout(reject('error'), 5000); 

本質上是使用調用reject('error')作爲setTimeout的第一個參數的結果。

+0

嘆...我怎麼錯過了?謝謝凱文。 – VietNg

0

()=>reject('error')reject('error')是完全不同的。在這種情況下,第一個語法與function(){ reject('error')}等效,但在調用reject('error')時未將其包裝在回調中將立即調用該函數。