我正在努力理解javascript承诺的糟糕世界,并且遇到了我不明白的事情。
第一个程序来自一本解释承诺链的书,并且正如你想象的那样工作:
var Promise = require('promise');
function delay(time) {
return new Promise( function(resolve,reject) {
setTimeout( resolve, time );
});
}
delay(1000) // step 1
.then(function STEP2(){
console.log( "step 2b (after 1000ms)" );
return delay( 2000 );
})
.then(function STEP3(){
console.log( "step 3b (after another 2000ms)" );
})
.then(function STEP4(){
console.log( "step 4b (next Job)" );
return delay( 5000 );
})
.then(function STEP5() {
console.log( "step 5b (after another 5000ms)" );
});
在正确的延迟时间后出现控制台日志。
现在,为了让我更清楚,我明确地制作了STEP函数,所以程序现在看起来像这样:
var Promise = require('promise');
function delay(time) {
return new Promise( function(resolve,reject){
setTimeout( resolve, time );
});
}
function STEP2() {
console.log( "step 2 (after 1000ms)" );
return delay( 2000 );
}
function STEP3() {
console.log( "step 3 (after another 2000ms)" );
}
function STEP4() {
console.log( "step 4 (next Job)" );
return delay( 5000 );
}
function STEP5() {
console.log( "step 5 (after another 5000ms)" );
}
delay( 1000 ).then(STEP2()).then(STEP3()).then(STEP4()).then(STEP5());
但是现在所有控制台日志都会立即发生,程序会延迟5000毫秒然后退出。有人可以解释上面两个例子之间的不同(功能上)吗?谢谢。
答案 0 :(得分:6)
在您的第一个示例中,您正在传递一个函数。在第二个示例中,您传递了函数的结果,因为您在函数名后面包含了()
。
这可能是你想要做的事情:
delay( 1000 ).then(STEP2).then(STEP3).then(STEP4).then(STEP5);