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

2022-08-30 05:30:43

我试图研究异步函数应该如何编写。经过大量研究,我仍然不清楚。

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

另一种提出问题的方法是:我应该如何解释以下函数?

var async_function = function(val, callback){
    process.nextTick(function(){
        callback(val);
    });
};

另外,我发现SO上的这个问题很有趣(“如何在node中创建一个非阻塞异步函数.js?”)。我不觉得它已经得到了回答。


答案 1

您似乎将异步 IO 与异步函数混淆了。node.js使用异步非阻塞 IO,因为非阻塞 IO 更好。理解它的最好方法是去看瑞安·达尔(ryan dahl)的一些视频。

如何为 Node 编写异步函数?

只需编写普通函数,唯一的区别是它们不会立即执行,而是作为回调传递。

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

通常,API 会给你一个回调,其中一个错误作为第一个参数。例如

database.query('something', function(err, result) {
  if (err) handle(err);
  doSomething(result);
});

是一种常见的模式。

另一种常见的模式是 。例如on('error')

process.on('uncaughtException', function (err) {
  console.log('Caught exception: ' + err);
});

编辑:

var async_function = function(val, callback){
    process.nextTick(function(){
        callback(val);
    });
};

上述函数调用时为

async_function(42, function(val) {
  console.log(val)
});
console.log(43);

将异步打印到控制台。特别是在当前事件循环调用堆栈为空之后触发。该调用堆栈在运行后为空。因此,我们打印 43 个,然后是 42 个。42process.nextTickasync_functionconsole.log(43)

您可能应该在事件循环上进行一些读取。


答案 2

仅仅通过回调传递是不够的。例如,您必须使用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");

如果你要运行上面的例子,这应该很好,将不得不等到这些函数完成工作。

伪多线程(异步)函数:

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");

这个将是真正的异步。这应该是好的,将在异步完成之前编写。