• node异步编程的集中解决方案


    一丶通过递归处理异步回调

    var fs = require('fs');
    // 要处理的文件列表
    var files = ['file1', 'file2', 'file3'];
    
    function parseFile () {
      if (files.length == 0) {
        return;
      }
      var file = files.shift();
      fs.readFile(file, function (err, data) {
        // 这里处理文件数据
        parseFile();  // 处理完毕后,通过递归调用处理下一个文件
      });
    }
    
    // 开始处理
    parseFile();

    二丶采用Async、Promise等第三方库处理异步回调(项目中我自己采用的是async)

    关于async总结:

    1.series(tasks, [callback]) 顺序执行数组、集合内的函数,当前面一个函数执行完成就会立即执行下一个函数,如果函数触发了错误,可以在callback函数中验证,否则会一直执行完成tasks

    async.series({
    one: function(callback) {
        setTimeout(function() {
            callback(null, 1);
        },
        200);
    },
    two: function(callback) {
        setTimeout(function() {
            callback(null, 2);
        },
        100);
      }
    },
    function(err, results) {
    // results is now equal to: {one: 1, two: 2}
    });

    2.parallel(tasks, [callback])  并行执行数组、集合内的方法,不用等到前一个函数执行完再执行下一个函数,如果函数触发了错误,可以在callback函数中验证

     async.parallel(
    [
      function(callback) {
        setTimeout(function() {
              callback(null, 'one');
            },
        200);
      },
      function(callback) {
        setTimeout(function() {
            callback(null, 'two');
        },
        100);
      }
    ],
     // optional callback
     function(err, results) {
        // the results array will equal ['one','two'] even thoug
        // the second function had a shorter             
        timeout
     }
    ); 

    3.waterfall(tasks, [callback])  tasks依次运行,前一个函数的回调会作为后一个函数的参数,如果有任何任务通过一个错误的回调,下一个函数不执行

    async.waterfall([
      function(callback){
          callback(null, 'one', 'two');
      },
      function(arg1, arg2, callback){
       // arg1 now equals 'one' and arg2 nowequals 'two'
          callback(null, 'three');
     },
      function(arg1, callback){
         // arg1 now equals 'three'
         callback(null, 'done');
     }
     ], function (err, result) {
        // result now equals 'done'    
    });
    
    

    三丶拥抱ES6,使用Generator特性替代回调函数

  • 相关阅读:
    Delphi的Colorbox不需要系统那么多颜色,只想自定义显示其中几个,怎么做?
    aName:array[0..31] of WideChar;//编译提示检测到错误类EAccessViolation//没有初始化
    ACCESS2003替换数据中的通配符 本身的办法
    startActivityForResult和setResult详解
    关于android和java环境和编译的一些基本知识
    onWindowFocusChanged重要作用
    线程取消(pthread_cancel)
    通过给程序里嵌入manifest,使得程序运行时弹出UAC窗口
    c#实现打印
    access导入mssql,access自动编号编号的问题
  • 原文地址:https://www.cnblogs.com/SunShineKG/p/7354943.html
Copyright © 2020-2023  润新知