zoukankan      html  css  js  c++  java
  • 使用Async同步执行异步函数

    为了适应异步编程,减少回调的嵌套,我在项目中引入了Async,当批量处理且需要同步执行一些逻辑相同的异步函数时,觉得还是Async最为靠谱。

    我有一个类似下面代码的场景,依据数组中的每一个元素执行一个异步回调函数,比如http.get。

    var http = require('http');
    var fs = require('fs');
    var args_array = [
        {name: "hao123", url: "http://www.hao123.com/index.html"},
        {name: "ifeng", url: "http://www.ifeng.com/"},
        {name: "baidu", url: "http://www.baidu.com/index.php?tn=10018801_hao"}
    ];
    
    args_array.forEach(function (element) {
        var file = fs.createWriteStream(element.name);
        http.get(element.url, function (response) {
            console.log(element.name);
            response.pipe(file);
        });
    });

    这个的代码是可以正常工作的,但是有一个问题,文件下载的顺序无法保证,我的需求是:数组中的每一个元素所执行的逻辑都依赖上一次执行的结果,下图表明了上述代码的执行的顺序。

    image

    修正后的代码,将单个执行逻辑封装成一个Function,放到一个数组中,由Async去执行这个数组,方能保证他们的顺序。

    var initFunctions = [];
    var Async = require('async');
    var http = require('http');
    var fs = require('fs');
    var args_array = [
        {name: "hao123", url: "http://www.hao123.com/index.html"},
        {name: "ifeng", url: "http://www.ifeng.com/"},
        {name: "baidu", url: "http://www.baidu.com/index.php?tn=10018801_hao"}
    ];
    args_array.forEach(function (element) {
        initFunctions.push(function (callback) {
            var file = fs.createWriteStream(element.name);
            http.get(element.url, function (response) {
                console.log(element.name);
                response.pipe(file);
                callback();
            });
        });
    });
    Async.series(initFunctions, function (error, values) {
        if (error) {
            console.log(error);
        }
        else {
            console.log("over~");
        }
    });

    image

  • 相关阅读:
    pycharm快捷键及一些常用设置
    常用笔记
    python开发之路day01
    [转]C++ Unicode SBCS 函数对照表
    PB15151793+PB16001775
    《梦断代码》读书笔记——第四周
    《人件》读书笔记——第三周
    《人月神话》读书笔记——第一周
    软件工程个人作业——词频统计
    《创新者》读书笔记——第五周读书笔记
  • 原文地址:https://www.cnblogs.com/fengxiang/p/3446302.html
Copyright © 2011-2022 走看看