Javascript承诺显式函数与内联函数
我试图理解javascript承诺的古怪世界,但遇到了这个我不理解的问题 第一个程序来自一本解释承诺链的书,其工作原理与您所想的一样:Javascript承诺显式函数与内联函数,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,我试图理解javascript承诺的古怪世界,但遇到了这个我不理解的问题 第一个程序来自一本解释承诺链的书,其工作原理与您所想的一样: var Promise = require('promise'); function delay(time) { return new Promise( function(resolve,reject) { setTimeout( resolve, time ); }); } delay(1000) // step 1
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毫秒,然后退出。有人能解释一下上面两个例子的不同之处吗?谢谢。在第一个示例中,您正在传入一个函数。在第二个示例中,由于在函数名后面包含了
()
,因此您正在传递函数的结果
这可能就是你想要做的:
delay( 1000 ).then(STEP2).then(STEP3).then(STEP4).then(STEP5);
在第一个版本中,您没有调用step函数(只是将它们作为参数传递)…@kevdev提示:您必须能够纯粹通过复制和粘贴将第一个示例转换为第二个示例。如果您不能做到这一点,则这两个代码示例并不相等。@zzzzBov否。这表明您不了解
foo
和foo()
之间的根本区别。这是一个语义错误,与错误输入函数名或编写,
而不是完全不同
在循环语句的中。与“请修复我的代码”的人群形成鲜明对比的是,人们在这里就语义错误提出问题是要学习的。他们的话题是一样的。这不是一个印刷错误——因为,直到现在,我还不知道它在函数作为参数传递或被调用之间运行的时间有什么不同。我天真地认为在延迟之后会调用STEP()函数。当然不是打字错误。好吧,这确实起了作用,但让我仍然感到困惑。可以归结为:delay(2000).then(function(){console.log(“After 2000ms”)});工作但“延迟(2000)。然后(console.log(“2000毫秒后”);”不是吗t@kevdev-您必须传递函数引用,以便promise基础结构稍后可以调用它<代码>函数(){console.log(“2000ms后”)}
是一个函数引用console.log(“2000ms后”)
不是函数引用。它立即运行console.log()
,并传递执行它的返回结果,该返回结果是未定义的。