Node.js控制流和回调

胜利者

一个月来,我一直感到困惑,搜索了所有内容,但找不到答案。

我想控制在node.js中首先运行的内容。我知道节点处理代码的方式是非阻塞的。我有以下示例:

setTimeOut(function(){console.log("one second passed");}, 1000);
console.log("HelloWorld");    

在这里,我想运行第一个,输出“第二个通过”,然后运行第二个。我怎样才能做到这一点?我知道setTimeOut是解决此问题的一种方法,但这不是我要的答案。我试过使用回调,但无法正常工作。我不确定是否对回调有正确的理解。回调只是对我来说意味着函数参数,我认为这不会帮助我解决此问题。

解决此问题的一种可能方法是定义一个包含“错误优先回调”的函数,如以下示例所示:

function print_helloworld_atend(function helloworld(){
    console.log("HelloWorld");
}){
    setTimeOut(function(){console.log("one second passed");}, 1000);
    helloworld();
}    

我可以定义一个带有回调函数的函数,该函数知道何时完成先前的任务。在上面的函数中,如何使回调函数:helloworld在“ setTimeOut”表达式之后运行?

如果有可以解决我的问题的结构,那是我的第一选择。我厌倦了使用setTimeOuts。

如果有人可以提供帮助,我将不胜感激。谢谢阅读

帕特里克·莫塔德

您应该使用诺言。蓝鸟是一个很有前途的图书馆。比本机快,并具有强大的功能。使用promise可以将函数链接在一起,并且知道在前一个函数解析之前不会调用一个函数。无需设置超时或延迟。虽然可以,但是您可以。以下是延迟的示例。功能B直到A完成后6秒钟才会运行。如果删除,则.delay(ms)B将在A完成后立即运行。

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);
    });

输出:

→ node test.js
hello
first: 1.278ms
world
tracked: 6009.422ms

编辑:我认为,诺言是node / javascript中控制流程最有趣的方式。据我所知,本机JavaScript承诺中没有.delay()或.timeout()。但是,总体上有一些承诺。您可以在mozilla的网站上找到其文档。我建议您改用Bluebird。

使用bluebird而不是nativebird是因为:

  • 它更快。蓝鸟的创建者Petka Antonov对V8引擎的两个编译步骤有很好的了解,并针对许多怪癖对库进行了优化。Native几乎没有优化,甚至没有优化,它会在您比较它们的性能时显示。这里这里有更多信息

  • 它有更多的功能:好东西一样.reflect().spread().delay().timeout(),这样的例子不胜枚举。

  • 通过切换,您将一无所获:蓝鸟中的所有功能也以完全相同的方式存在于本机功能中。如果您发现自己只能使用本机,则不必重新学习已经知道的知识。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章