Node.js控制流和回调

时间:2016-08-26 20:14:39

标签: node.js callback

我已经对这个问题感到困惑了一个月,并搜索了所有内容,但找不到答案。

我希望控制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。

如果有人能提供帮助我真的很感激。感谢您的阅读

3 个答案:

答案 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,因为:

  • 速度更快。蓝鸟的创造者Petka Antonov非常了解V8引擎的两个编译步骤,并针对它的许多怪癖优化了库。 Native几乎没有优化,它会在你比较它们的性能时显示出来。更多信息herehere

  • 它有更多功能→ node test.js hello first: 1.278ms world tracked: 6009.422ms .reflect().spread().delay()等好消息,列表继续。

  • 切换您没有任何损失:bluebird中的所有功能在本机功能中也以完全相同的方式存在。如果您发现自己处于只有原生的情况,您就不必重新学习您已经知道的内容。

答案 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工作,调用回调函数 功能:感谢您的通知,继续处理其他工作。