我已经对这个问题感到困惑了一个月,并搜索了所有内容,但找不到答案。
我希望控制node.js中首先运行的内容。我知道节点处理代码的方式是非阻塞的。我有以下示例:
setTimeOut(function(){console.log("one second passed");}, 1000);
console.log("HelloWorld");
这里我想先运行一次,输出#34;一秒钟后通过",然后运行第二个。我怎样才能做到这一点?我知道setTimeOut是一种解决这个问题的方法,但这不是我要找的答案。我尝试过使用回调但没有工作。我不确定我是否对回调有正确的理解。回调只是意味着我的功能参数,我不认为这将有助于我解决这个问题。
解决此问题的一种可能方法是定义一个包含"错误的第一个回调"如下例所示:
function print_helloworld_atend(function helloworld(){
console.log("HelloWorld");
}){
setTimeOut(function(){console.log("one second passed");}, 1000);
helloworld();
}
我可以使用回调定义一个函数,该函数将知道先前任务的完成时间。在上面的函数中,如何使回调函数:helloworld在" setTimeOut"之后运行。表达
如果有一个结构可以解决我的问题,这是我的第一选择。我厌倦了使用setTimeOuts。
如果有人能提供帮助我真的很感激。感谢您的阅读
答案 0 :(得分:2)
你应该使用承诺。 Bluebird是一个伟大的承诺库。比原生更快,并具有很棒的功能。使用promises,您可以将函数链接在一起,并且知道在上一个函数结算之前不会调用函数。无需设置超时或延迟。虽然你可以,如果你愿意的话。以下是延迟的示例。功能B在A完成后不会运行直到6秒。如果删除MAKEFLAGS=--assume-new=$(MAKECMDGOALS)
B将在A完成后立即运行。
.delay(ms)
输出:
var Promise = require("bluebird");
console.time('tracked');
console.time('first');
function a (){
console.log('hello');
console.timeEnd('first');
return Promise.resolve();
}
function b (){
console.log('world');
console.timeEnd('tracked');
}
a().delay(6000)
.then(b)
.catch(Promise.TimeoutError, function(e) {
console.log('Something messed up yo', e);
});
编辑:在我看来,Promise是节点/ javascript中最有趣的控制流方式。据我所知,本机javascript承诺中没有.delay()或.timeout()。但是,一般都有承诺。您可以在mozilla的网站上找到他们的文档。我建议您使用Bluebird。
使用bluebird而不是native,因为:
答案 1 :(得分:0)
在您记录“一秒钟过去”之后,只需执行您想要执行的所有内容,即“一秒钟后”:
setTimeOut(function(){
console.log("one second passed");
console.log("HelloWorld");
}, 1000);
答案 2 :(得分:0)
您可以使用https://jsfiddle.net/o04btr3j/276/模块来处理回调。
要理解回调,我会给你一个高水平的一瞥:
功能:我想做一些i / o工作
nodejs :好的,但是我不应该阻止我的流程,因为我是单线程的。
nodejs :传递一个回调函数,当i / o工作完成后,我会通过它告诉你。
功能:传递回调函数
nodejs :完成i / o工作,调用回调函数
功能:感谢您的通知,继续处理其他工作。