Javascript 为什么在我添加Promise代码时,该代码会立即执行?

Javascript 为什么在我添加Promise代码时,该代码会立即执行?,javascript,promise,settimeout,Javascript,Promise,Settimeout,在下面的代码中,我预计会有两次4秒的延迟。但是如果您运行代码,您将看到它立即执行。很明显,我不理解一些非常基本的东西,或者我是一个愚蠢的错误,我看不出来 函数计算方法(解析){ 控制台日志(“计算”); setTimeout(结果(解析,3),4000); } var-answer=0; 函数结果(解析,n){ log(“得到结果”); 答案=1; 解决(回答+n); } 函数doingstuff(){ 控制台日志(“启动”); var promise1=新承诺(功能(解决){ 设置超时(计算

在下面的代码中,我预计会有两次4秒的延迟。但是如果您运行代码,您将看到它立即执行。很明显,我不理解一些非常基本的东西,或者我是一个愚蠢的错误,我看不出来

函数计算方法(解析){
控制台日志(“计算”);
setTimeout(结果(解析,3),4000);
}
var-answer=0;
函数结果(解析,n){
log(“得到结果”);
答案=1;
解决(回答+n);
}
函数doingstuff(){
控制台日志(“启动”);
var promise1=新承诺(功能(解决){
设置超时(计算方法(解析),4000);
});
承诺1.然后(功能(价值){
console.log(“完成:+值);
});
console.log(“定期执行”);
}

doingstuff()
setTimeout
接受回调函数作为第一个参数,可能的解决方案之一是将函数调用封装在匿名函数中,如下所示:

函数计算方法(解析){
控制台日志(“计算”);
setTimeout(函数(){
结果(3);
}, 4000)
}
var-answer=0;
函数结果(解析,n){
log(“得到结果”);
答案=1;
解决(回答+n);
}
函数doingstuff(){
控制台日志(“启动”);
var promise1=新承诺(功能(解决){
setTimeout(函数(){
计算方法(解析)
}, 4000);
});
承诺1.然后(功能(价值){
console.log(“完成:+值);
});
console.log(“定期执行”);
}

doingstuff()最基本的事情是:

 setTimeout(results(resolve,3),4000);
您不需要直接调用函数并传递返回值,而是传递函数引用:

 setTimeout(results, 4000, /*args:*/ resolve, 4);

直到您可以使用
setTimeout
传递参数。非常优雅的解决方案,upvote@derek每个人只花了10分钟的时间来写和回答,就这样一个常见的错误,我得到了5张赞成票,这在任何地方都是有据可查的……:你不知道吗?这让我惊讶…@商业自杀谢谢:)@JonasW。即使作为一名经验丰富的开发人员,JavaScript仍然不时给我带来惊喜;)哇,它现在工作了!!我将对此进行更多的研究以了解。我已经多次使用setTimeout,但都没有这个问题。非常感谢@用户1254723,干杯<代码>乔纳斯W.提供了更优雅的方式,我支持他,但我的例子也有效,但不那么优雅。
:)。。。我很感激,但这并不是强制性的,只是说…@Jonas W.,明白了,答案是更新的=)