Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js控制流和回调_Node.js_Callback - Fatal编程技术网

Node.js控制流和回调

Node.js控制流和回调,node.js,callback,Node.js,Callback,我对此困惑了一个月,搜索了所有的东西,但找不到答案 我想控制node.js中首先运行的内容。我知道node处理代码的方式是非阻塞的。我举了以下例子: setTimeOut(function(){console.log("one second passed");}, 1000); console.log("HelloWorld"); function print_helloworld_atend(function helloworld(){ console.log("HelloW

我对此困惑了一个月,搜索了所有的东西,但找不到答案

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

setTimeOut(function(){console.log("one second passed");}, 1000);
console.log("HelloWorld");    
function print_helloworld_atend(function helloworld(){
    console.log("HelloWorld");
}){
    setTimeOut(function(){console.log("one second passed");}, 1000);
    helloworld();
}    
这里我想运行第一个,输出“1秒通过”,然后运行第二个。我该怎么做?我知道setTimeOut是解决这个问题的一种方法,但这不是我想要的答案。我尝试过使用回调,但不起作用。我不确定我是否正确理解了回调。回调对我来说只是指函数参数,我不认为这能帮助我解决这个问题

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

setTimeOut(function(){console.log("one second passed");}, 1000);
console.log("HelloWorld");    
function print_helloworld_atend(function helloworld(){
    console.log("HelloWorld");
}){
    setTimeOut(function(){console.log("one second passed");}, 1000);
    helloworld();
}    
我可以定义一个带有回调函数的函数吗?回调函数将知道前面的任务何时完成。在上面的函数中,如何使回调函数:helloworld在“setTimeOut”表达式之后运行

如果有一个结构可以解决我的问题,那就是我的第一选择。我厌倦了使用设置超时


如果有人能帮忙,我将不胜感激。感谢阅读

在您记录“1秒通过”之后,在您记录“1秒通过”之后,只需执行您想要执行的所有操作即可:

您可以使用模块来处理回调

为了理解回调,我将向您提供一个高层次的概览:

功能:我想做一些i/o工作。
nodejs:好的,但你不应该阻止我的进程,因为我是单线程的。
nodejs:传递回调函数,当I/o工作完成时,我会让您知道。 函数:传递回调函数
nodejs:i/o工作完成后,调用回调函数。

功能:感谢您的通知,继续处理其他工作。

您应该使用承诺。是一个很有前途的图书馆。比本机更快,并具有强大的功能。通过承诺,您可以将函数链接在一起,并且知道在前一个函数解析之前不会调用其中一个函数。无需设置超时或延迟。尽管你可以,如果你愿意的话。下面是一个延迟的例子。函数B直到A完成后6秒才会运行。如果删除
。延迟(毫秒)
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的创始人佩特卡·安东诺夫(Petka Antonov)对V8引擎的两个编译步骤有着深刻的理解,并围绕它的许多怪癖对库进行了优化。Native几乎没有优化,当您比较它们的性能时,它会显示出来。更多信息和信息

  • 它有更多的功能:像
    .reflect()
    .spread()
    .delay()
    .timeout()
    这样的好东西,列表还在继续

  • 切换不会丢失任何东西。:bluebird中的所有功能也以与实现中完全相同的方式存在于本机函数中。如果你发现自己处于一种只有本地人可以使用的情况下,你就不必重新学习你已经知道的东西


您好,谢谢您的回复。以上只是一个例子。我知道这会解决问题,但我有大量的代码、函数和模块,我无法计算每个模块的时间。你有其他方法可以实现吗?@Victor你不需要计算任何时间,只要把你的代码放在你想让它运行的代码后面,但不要放在
setTimeout
或任何你调用的有延迟的函数之外。将超时后希望发生的所有事情都保留在该超时的回调中。@Victor您可以使用s更好地组织代码,我强烈建议,但是Promise’s不要添加任何使用回调无法实现的功能,我认为在使用Promises之前理解回调以及如何做出自己的承诺是很重要的。settimeout中的代码行只是一个示例,意味着需要做很多工作。我的问题是我如何知道这个过程何时完成。thanks@Victor回调中的所有内容都是在完成后执行的。问题是我不知道什么时候工作完成了,以及如何让回调函数监视进程并在进程完成时执行。这对我来说绝对是最棒的解决方案。没有库我们能做到吗?如果您发现这个答案完整,请不要忘记将其升级/标记为已解决。:)