关于回调函数和回调函数常出现的问题

所谓回调函数,就是把任务的第二段单独写在一个函数里边,等到重新执行这个任务的时候,就直接调用这个函数。

fs.readFile('某文件', function (err, data) {
  if (err) throw err;
  console.log(data);
});

这是一个错误优先的回调函数(error-first callbacks),这也是Node.js本身的特点之一

回调常见的问题:

1.异常处理

try{
  //TODO
}catch(e){
  //TODO
}

异步代码时try catch不再生效

let async = function(callback){
  try{
    setTimeout(function(){
      callback();
    },1000)
  }catch(e){
    console.log('捕获错误',e);
  }
}

async(function(){
  console.log(t);
});

因为这个回调函数被存放起来了,直到下一个事件循环的时候才会取出,try只能捕获当前循环内的异常面对callback异步无能为力。

Node在处理异常有一个约定,将异常作为回调的第一个实参传回,如果为空表示没有出错。

async(function(err,callback){
  if(err){
    console.log(err);
  }
});

异步方法也要遵循两个原则:

  • 必须要在异步之后调用传入的回调函数
  • 如果出错了要向回调函数传入异常供调用者判断
let async = function(callback){
try{
  setTimeout(function(){
    if(success)
      callback(null);
    else
      callback('错误');
  },1000)
}catch(e){
  console.log('捕获错误',e);
}
}

2.回调地域

异步多级依赖的情况下嵌套的非常深,代码难以阅读和维护

let fs = require('fs');
fs.readFile('template.txt','utf8',function(err,template){
fs.readFile('data.txt','utf8',function(err,data){
  console.log(template+' '+data);
})
})
原文地址:https://www.cnblogs.com/Scar007/p/8953365.html