2016-12-01 73 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')时未将其包装在回调中将立即调用该函数。