-- 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函数执行完毕之后用回调函数将结果返回。
常见问题
快速入门
无