zoukankan      html  css  js  c++  java
  • 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特性替代回调函数

  • 相关阅读:
    JQuery源码解析-Dom加载过程
    多个script标签的作用域
    JQuery源码解析-JQuery的工具方法(1)
    JQuery源码解析-JQuery的工具方法
    JQuery源码解析-JQuery.extend()方法
    JQuery源码解析-添加JQuery的一些方法和属性
    中兴捧月算法精英挑战赛-迪杰斯特拉派
    C语言中的内存相关问题
    动态内存管理
    虚函数与虚继承小结
  • 原文地址:https://www.cnblogs.com/SunShineKG/p/7354943.html
Copyright © 2011-2022 走看看