Node.js控制流和回调
我对此困惑了一个月,搜索了所有的东西,但找不到答案 我想控制node.js中首先运行的内容。我知道node处理代码的方式是非阻塞的。我举了以下例子: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
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中的所有功能也以与实现中完全相同的方式存在于本机函数中。如果你发现自己处于一种只有本地人可以使用的情况下,你就不必重新学习你已经知道的东西
setTimeout
或任何你调用的有延迟的函数之外。将超时后希望发生的所有事情都保留在该超时的回调中。@Victor您可以使用s更好地组织代码,我强烈建议,但是Promise’s不要添加任何使用回调无法实现的功能,我认为在使用Promises之前理解回调以及如何做出自己的承诺是很重要的。settimeout中的代码行只是一个示例,意味着需要做很多工作。我的问题是我如何知道这个过程何时完成。thanks@Victor回调中的所有内容都是在完成后执行的。问题是我不知道什么时候工作完成了,以及如何让回调函数监视进程并在进程完成时执行。这对我来说绝对是最棒的解决方案。没有库我们能做到吗?如果您发现这个答案完整,请不要忘记将其升级/标记为已解决。:)