zoukankan      html  css  js  c++  java
  • 关于回调函数和回调函数常出现的问题

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

    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);
    })
    })
  • 相关阅读:
    2073: [POI2004]PRZ
    BZOJ 3669: [Noi2014]魔法森林
    Dominator Tree & Lengauer-Tarjan Algorithm
    BZOJ 3526: [Poi2014]Card
    BZOJ 2733: [HNOI2012]永无乡
    BZOJ 2929: [Poi1999]洞穴攀行
    BZOJ 3730: 震波
    BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡
    BZOJ 1195: [HNOI2006]最短母串
    BZOJ 4030: [HEOI2015]小L的白日梦
  • 原文地址:https://www.cnblogs.com/Scar007/p/8953365.html
Copyright © 2011-2022 走看看