我想将一个http请求的响应传递给另一个同步,
有三个条件可以逐个执行PreExecute(),OnExecute() and PostExecute()
。
上面的每一个都会向URL发送http请求并返回一个json,它应该是下一个模块的输入。如何在Node.js中实现这一点
答案 0 :(得分:0)
使用waterfall
库中的async
。你可以像这样工作
var request = require('request');
var async = require('async');
async.waterfall([
function (callback) { //PreExecute
request('http://www.google.com', function (error, response, body) {
callback(null, 'one', 'two');
});
},
function (arg1, arg2, callback) { //OnExecute
request('http://www.google.com', function (error, response, body) {
// arg1 now equals 'one' and arg2 now equals 'two'
callback(null, 'three');
});
},
function (arg1, callback) { // PostExecute
request('http://www.google.com', function (error, response, body) {
// arg1 now equals 'three'
callback(null, 'done');
});
}
], function (err, result) { // Finally
// result now equals 'done'
});
答案 1 :(得分:0)
如果你的三个函数中的每一个都返回一个使用异步操作的结果解析的promise,那么使用promise链接就很简单了:
PreExecute(...).then(OnExecute).then(PostExecute).then(result => {
// all done here
}).catch(err => {
// an error occurred
});
在此序列中,PreExecute()
的已解析结果将作为单个参数传递给OnExecute()
,并且OnExecute()
的已解析结果将作为单个参数传递给{{1}并且PostExecute()
的已解析结果将传递给最终的PostExecute()
处理程序。如果三者中的任何一个发生错误,则该错误将传递给.then()
处理程序。这是Promise链接的经典用法,用于对异步操作进行排序并将数据传递到链中。
如果你的函数还没有返回一个promise,那么我们需要确切地知道他们是如何知道他们已经完成的(也许是使用回调),并且他们可能只是简单地包含在使这个结构工作的承诺中。
如果您的.catch()
函数遵循node.js异步调用约定并接受回调作为其最后一个以PreExecute()
作为参数调用的参数,那么您可以" promisify&#34 ;使用util.promisify()
可以非常轻松地完成这些功能。如果他们没有办法让调用者知道他们的底层异步操作何时完成,那么必须修复它们才能提供。如果他们没有提供知道何时完成的方法,则没有其他方法可以对它们进行排序。