如何为Node.js编写异步函数

Kri*_*iem 113 javascript asynchronous node.js

我试图研究应该如何编写完全异步的函数.经过大量文档的大量工作后,我仍然不清楚.

如何为Node编写异步函数?我该如何正确实现错误事件处理?

问我问题的另一种方法是:我应该如何解释以下功能?

var async_function = function(val, callback){
    process.nextTick(function(){
        callback(val);
    });
};
Run Code Online (Sandbox Code Playgroud)

另外,我发现SO上的这个问题("如何在node.js中创建非阻塞异步函数?")很有趣.我觉得它还没有得到回答.

Ray*_*nos 85

您似乎将异步IO与异步函数混淆.node.js使用异步非阻塞IO,因为非阻塞IO更好.理解它的最好方法是观看ryan dahl的一些视频.

如何为Node编写异步函数?

只写正常函数,唯一的区别是它们不是立即执行而是作为回调传递.

我该如何正确实现错误事件处理

通常API会给你一个带有错误作为第一个参数的回调.例如

database.query('something', function(err, result) {
  if (err) handle(err);
  doSomething(result);
});
Run Code Online (Sandbox Code Playgroud)

是一种常见的模式.

另一个常见的模式是on('error').例如

process.on('uncaughtException', function (err) {
  console.log('Caught exception: ' + err);
});
Run Code Online (Sandbox Code Playgroud)

编辑:

var async_function = function(val, callback){
    process.nextTick(function(){
        callback(val);
    });
};
Run Code Online (Sandbox Code Playgroud)

调用上面的函数

async_function(42, function(val) {
  console.log(val)
});
console.log(43);
Run Code Online (Sandbox Code Playgroud)

42异步打印到控制台.特别是process.nextTick在当前eventloop callstack为空后触发.这调用堆栈是空后async_functionconsole.log(43)已经运行.所以我们打印43,然后是42.

您应该对事件循环进行一些阅读.


cal*_*ird 9

仅通过回调是不够的.例如,您必须使用settimer来使函数异步.

示例:不是异步函数:

function a() {
  var a = 0;    
  for(i=0; i<10000000; i++) {
    a++;
  };
  b();
};

function b() {
  var a = 0;    
  for(i=0; i<10000000; i++) {
    a++;
  };    
  c();
};

function c() {
  for(i=0; i<10000000; i++) {
  };
  console.log("async finished!");
};

a();
console.log("This should be good");
Run Code Online (Sandbox Code Playgroud)

如果你将运行上面的例子,这应该是好的,将不得不等待,直到这些功能将完成工作.

伪多线程(异步)函数:

function a() {
  setTimeout ( function() {
    var a = 0;  
    for(i=0; i<10000000; i++) {
      a++;
    };
    b();
  }, 0);
};

function b() {
  setTimeout ( function() {
    var a = 0;  
    for(i=0; i<10000000; i++) {
      a++;
    };  
    c();
  }, 0);
};

function c() {
  setTimeout ( function() {
    for(i=0; i<10000000; i++) {
    };
    console.log("async finished!");
  }, 0);
};

a();
console.log("This should be good");
Run Code Online (Sandbox Code Playgroud)

这个将是异常的异步.这应该是好的将在异步完成之前写入.


Cri*_*s-O 5

你应该看一下:Node Tuts第19集 - 异步迭代模式

它应该回答你的问题.