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);
    })
    })
  • 相关阅读:
    【带权并查集】How Many Answers Are Wrong HDU
    【带权并查集+离散化】Parity game POJ
    【并查集】Supermarket POJ
    【并查集】P3958 奶酪
    【并查集-判环】Is It A Tree? POJ
    【最短路/线性差分约束】Layout POJ
    【最短路-负环】Extended Traffic LightOJ
    【最短路】Subway POJ
    【最短路-判负环 Floyd】Wormholes POJ
    [JZOJ]1293.气象牛[区间DP]
  • 原文地址:https://www.cnblogs.com/Scar007/p/8953365.html
Copyright © 2011-2022 走看看