在nodejs中编写“阻塞”代码

时间:2011-03-20 02:39:16

标签: javascript node.js

nodejs中的所有内容都是非阻塞的,这很好,但是如何在不使用大量嵌套回调列表的情况下创建必须一个接一个的函数all?

5 个答案:

答案 0 :(得分:12)

你没有必须嵌套你的回调。

编写异步代码时有很多模式。

例如,这种matrioska-nested-style ......

database.find('foo', function (err, data) {
  database.update('foo', 'bar', function (err, data) {
    database.delete('bar', function (err, data) {
      console.log(data);
    });
  });
});

...可以用更干净(但更详细)的方式重写:

var onDelete = function (err, data) {
      console.log(data);
    },

    onUpdate = function (err, data) {
      database.delete('bar', onDelete);
    },

    onFind = function (err, data) {
      database.update('foo', 'bar', onUpdate);
    };

database.find('foo', onFind);

另一种选择是使用模块来抽象回调的串行和并行执行。

答案 1 :(得分:8)

Use Step

它是“node.JS的一个简单的控制流库,可以使并行执行,串行执行和错误处理无痛”。

答案 2 :(得分:3)

您真正想要做的是找出您的操作阻止的原因并重新编码它们以使它们无阻塞。删除彼此的依赖关系。您需要改变您考虑非阻塞IO的方式。

使用库允许您以同步阻塞方式运行此类型代码只是一个糟糕的拐杖。

学习如何在node.js中编写非阻塞代码会更好,因为这就是它的设计目的。

答案 3 :(得分:2)

async module是一个特别好的解决方案 - 使用它可以产生更清晰的异步代码,嵌套更浅。你可以通过以下方式获得:

npm install async --save

特别看看:

  • async.series :这使您可以设置一个接一个地运行的函数列表 - 列表中的每个函数仅在完成之前运行。但是,其他代码(在定义的系列之外)可以无阻塞地运行。
  • async.series :这类似于async.series,除了列表中的每个函数都将其结果传递给列表中的下一个,最终结果传递给最后定义的回调

但是,所有async's control flow-specific methods对于避免巨大的嵌套回调列表都非常有帮助。

另外,如果它有用,here's a jsFiddle I put together在学习库时,包含一组示例,包括async.waterfall&另一个用于async.series(打开控制台以查看它正在做什么)。

答案 4 :(得分:1)

use ES6 async and await method's for writing blocking code
====================================================================
Ex: 
  async function fName(){
   lat firstResult=await task1;
   let secondResult= await task2
}

function task1(){
   //write your logic and after finishing your task return result as a PROMISE
return new Promise((reslove,reject)=>{
   // write logic hear after reslove(success) or reject(error)
})
}

function task2(){
   //write your logic and after finishing your task return result as a PROMISE
return new Promise((reslove,reject)=>{
   // write logic hear after reslove(success) or reject(error)
})
};