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

  • 相关阅读:
    drf请求生命周期
    正向代理和反向代理
    cbv源码分析
    Python搭建调用本地dll的Windows服务(浏览器可以访问,附测试dll64位和32位文件)
    Python实现聊天机器人接口封装部署
    Python实现机器人语音聊天
    Python爬虫下载美女图片(不同网站不同方法)
    微信小程序-点餐系统
    Win10系统Python3.8的升级与安装
    Python破解Wifi密码思路
  • 原文地址:https://www.cnblogs.com/fengxiang/p/3446302.html
Copyright © 2011-2022 走看看