to be
a problem slover

Node.js回调函数(callback)详解

在一个同步程序中,你可以写一些类似的函数:

function processData() {
  var data = fetchData();
  data += 1;
  return data;
}

但是如果 fetchData 需要很长的时间来加载数据(可能是从硬盘或互联网上的流媒体),那么这就会导致整个程序阻塞–直到数据被获取到。Node.js 不会等待文件 I/O 之类的事情完成,Node.js 倾向于使用回调函数(callback)。回调是在指定任务完成时调用的函数;这可以避免阻塞,并允许其他代码在此期间运行。

Node.js 的处理方式类似这样:

function processData(callback) {
  fetchData(function (err, data) {
    if (err) {
      console.log("An error has occurred. Abort everything!");
      return callback(err);
    }
    data += 1;
    callback(data);
  });
}

乍一看这看起来好像很复杂啊! 但回调是 Node.js 的基础,回调为你提供了一个接口,你可以用回调来控制程序:做完了那一件事,就做这一件。这可以让系统能处理的 IO 操作同时发生。例如,在一个有成百上千个阻塞查询请求的 web 服务器中,异步执行阻塞查询让程序能够继续工作,而不是静静地着等阻塞操作完成。这是一个重大的改进。

异步函数的典型惯例:

function asyncOperation ( a, b, c, callback ) {
  // ... lots of hard work ...
  if ( /* an error occurs */ ) {
    return callback(new Error("An error has occurred"));
  }
  // ... more work ...
  callback(null, d, e, f);
}

asyncOperation ( params.., function ( err, returnValues.. ) {
  //This code gets run after the async operation gets run
});

你应该遵循回调惯例,因为大多数 Node.js 用户会希望你的项目遵循它。一般的做法是,callback函数是最后一个参数。在函数完成所有操作后,callback函数就会被调用。习惯上,回调的第一个参数是error。如果函数遇到错误,那么他们通常会以第一个参数为Error对象来调用 callback函数。如果处理不遇到错误,那么error参数为null,其余的是返回值。

本文译自:What are callbacks?

赞(8) 打赏
欢迎转载,注明出处:刘世明的博客 » Node.js回调函数(callback)详解

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下作者

支付宝扫一扫打赏

微信扫一扫打赏