nodejs (async+request)异步:waterfall,parallel,Series

-- nodejs (async+request)异步请求且按顺序执行,后面函数会作为前面函数的回调入参,前面函数设置后面函数的入参
【官网】:https://nodejs.org/en/

应用场景

nodejs天生是单进程单线程的,这个是由它在浏览器执行的环境和机制决定的 如果使用sync-request则容易引起阻塞,这里推荐使用async+request

基础资源

nodejs,async,request

使用须知

注意使用场景对并发,性能的要求

配置步骤

【一个基于async.waterfall+request实现多个请求顺序且依赖执行的实现示例1-匿名函数】

var request = require(‘request‘);

var async = require(‘async‘);

//这里省去一些处理

async.waterfall([
        function (cb) {
            request({
                headers: {
                    "content-type": "application/x-www-form-urlencoded"
                },
                method: "POST",
                url: "https://config.net.cn/exmaple/user/gettoken",
                body: "accesstoken=Qo4PB36niryYI2JddcT2+aU6H+c5MLtWL5mZyxygzuWuUQmkAGx+t78ciGeIxXjzKV5eIsxegkrGofFynqg/K9sYFB6hci1c"
            }, function (error, response, body) {
                cb(error, body);
            });
        },
        function (token, cb) {
            var authorization = "Bearer " + token;
            request({
                headers: {
                    "Authorization": authorization
                },
                method: "POST",
                url: "https://config.net.cn/exmaple/api/subscribe",
                json: true,
                body: {
                    userid: loginUserId
                }
            }, function (error, response, body) {
                cb(null, body);
            });
        }
    ],

    function (err, result) {

       // result now equals ‘done‘

        callback(null, result);

    });

-----------

[注1]匿名函数function (token, cb) 作为function (cb)的入参,代表一个回调函数.

       第一个红色的body作为调用回调函数function(token,cb)的token参数.

[注2]匿名函数function (err, result)作为function (token, cb)的入参,代表一个回调函数.

       第一个绿色的body作为调用回调函数function(err,result)的result参数.


【一个基于async.waterfall+request实现多个请求顺序且依赖执行的实现示例2-非匿名函数】

var request = require(‘request‘);

var async = require(‘async‘);

//这里省去一些处理


function firstFunction (cb) {
            request({
                headers: {
                    "content-type": "application/x-www-form-urlencoded"
                },
                method: "POST",
                url: "https://config.net.cn/exmaple/user/gettoken",
                body: "accesstoken=Qo4PB36niryYI2JddcT2+aU6H+c5MLtWL5mZyxygzuWuUQmkAGx+t78ciGeIxXjzKV5eIsxegkrGofFynqg/K9sYFB6hci1c"
            }, function (error, response, body) {
                cb(error, body);
            });
        }

 function  secondFunction(token, cb) {
            var authorization = "Bearer " + token;
            request({
                headers: {
                    "Authorization": authorization
                },
                method: "POST",
                url: "https://config.net.cn/exmaple/api/subscribe",
                json: true,
                body: {
                    userid: loginUserId
                }
            }, function (error, response, body) {
                cb(null, body);
            });
        }

async.waterfall([

    firstFunction,

   secondFunction

],

 function (err, result) {

       // result now equals ‘done‘

        callback(null, result);

    });



【一个基于async.series+request实现多个请求顺序执行且无依赖的实现】

  在合适的场景下,这种需求实现只需要将上述async.waterfall  改为 async.series即可

和watarfall相同,也是按顺序执行数组里的task,没有调用到callback不会执行下一个task
// 不同的是:所有的task只有一个参数callback。所有往下传递的参数都会被放入最终函数的数组results里


【一个基于async.paralle+request实现多个请求并行执行无需等待前面函数执行完的实现】

  在合适的场景下,这种需求实现只需要将上述async.waterfall  改为 async.parallel即可

[注]并行运行函数集合,而不必等到上一个函数完成。如果任何函数发生错误,会立刻执行回调函数,并返回错误信息;若没有发生错误,则会在所有tasks函数执行完毕之后用回调函数将结果返回。





常见问题

快速入门

参考资料