javascript - 简单的 Node.js 应用程序控制流程

标签 javascript node.js asynchronous

我有一个关于基本应用程序控制流的简单菜鸟问题。我有 3 个带有 setTimeout 的函数。

console.log("[+] Program start");

function first(){
setTimeout(function(){
  console.log(1);
},3000);}

function second(){
setTimeout(function(){
  console.log(2);
},2000);}

function third(){
setTimeout(function(){
  console.log(3);  
},1000);}

first();
second();
third();

console.log("done");

输出符合预期:

[+] Program start
done
3
2
1

我想控制流程,我将按以下顺序查看内容:

[+] Program start
1
2
3
done

所以我通过以下方式重写了程序:

console.log("[+] Program start");

function first(){
setTimeout(function(){
  console.log(1);
  second();
},3000);}

function second(){
setTimeout(function(){
  console.log(2);
  third();
},2000);}

function third(){
setTimeout(function(){
  console.log(3);  
  call();
},1000);}

first();

function call(){console.log("done ");}

输出是:

[+] Program start
1
2
3
done 

现在输出已经可以了,请问一下,这种做法对吗?这是如何控制流程或如何在node.js中编写的正确方法?或者我完全走错路了。您能否检查一下并给我一些提示、建议等。非常感谢您的帮助。

最佳答案

如果您尝试管理操作顺序,您绝对不希望使用 setTimeout() 来执行此操作。 setTimeout() 旨在阻止线程执行直到完成,使用这种方式会使您的应用程序异常脆弱。

假设您只是想管理流程,请阅读 Node.js 事件循环的工作原理。以这种方式编写的代码将如下所示(我在其中添加了一些 setTimeout() 函数来模拟/说明长时间运行的函数):

console.log("[+] Program start")

var first = function(callback) {
    setTimeout(function() {
        console.log(1)
        callback()
    }, 1000)
}

var second = function(callback) {
    setTimeout(function() {
        console.log(2)
        callback()
    }, 1000)
}

var third = function(callback) {
    setTimeout(function() {
        console.log(3)
        callback()
    }, 1000)
}


first(function() {
    second(function() {
        third(function() {
            console.log("done ")        
        })
    })
})

话虽如此,以这样的嵌套方式使用回调有一个固有的缺点:“回调 hell ”。您可以考虑使用类似async之类的东西来模块化您的功能。的 waterfall ,或者 Promise 库。

加分点:您还可以在 ES6 中更简洁地编写函数链:

first(() => second(() => third(() =>
    console.log("done ")        
)))

关于javascript - 简单的 Node.js 应用程序控制流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42032031/

相关文章:

javascript - 为什么在悬停时更改源时这些 SVG 图像无法正确加载?

node.js - Express、node.js 和 redis : Separated function to access data

javascript - Nodejs : ReferenceError: express is not defined

asynchronous - 在 Neovim 中运行异步 Lua 函数

node.js - 使用 supertest 和 async.parallel 发送并行 http 请求?

javascript - Highcharts:向图表添加线条会从 X 轴删除标签

javascript - 从 jQuery 访问外部方法 'closure'

javascript - 如何只为当前用户公开字段?

c# - Linux 重叠 I/O TCP 套接字服务器未正确响应 C# 异步客户端

javascript - 如何将 HashMap 数组插入 Redis? ( Node .js)