如何链接和分享先前的结果与承诺
我正在使用蓝鸟库,需要进行一系列的HTTP请求,并需要一些响应数据到下一个HTTP请求。 我已经构建了一个处理我的请求callhttp()
的函数。 这需要一个URL和一个POST的正文。
我这样称呼它:
var payload = '{"Username": "joe", "Password": "password"}'; var join = Promise.join; join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), function (first, second, third) { console.log([first, second, third]); });
第一个请求获取需要传递给第二个请求的API密钥等等。 如何从第一个请求获取响应数据?
UPDATE
这是callhttp
函数:
var Promise = require("bluebird"); var Request = Promise.promisify(require('request')); function callhttp(host, body) { var options = { url: 'https://' + host + '/api/authorize', method: "POST", headers: { 'content-type': 'application/json' }, body: body, strictSSL: false }; return Request(options).spread(function (response) { if (response.statusCode == 200) { // console.log(body) console.log(response.connection.getPeerCertificate().subject.CN) return { data: response.body }; } else { // Just an example, 200 is not the only successful code throw new Error("HTTP Error: " + response.statusCode ); } }); }
有一些依赖承诺的模型,并将数据从一个传递到下一个。 哪一个效果最好取决于您是否只需要下一次调用中的以前的数据,或者是否需要访问所有以前的数据。 这里有几个模型:
下一个饲料结果
callhttp(url1, data1).then(function(result1) { // result1 is available here return callhttp(url2, data2); }).then(function(result2) { // only result2 is available here return callhttp(url3, data3); }).then(function(result3) { // all three are done now, final result is in result3 });
将中间结果分配给更高的范围
var r1, r2, r3; callhttp(url1, data1).then(function(result1) { r1 = result1; return callhttp(url2, data2); }).then(function(result2) { r2 = result2; // can access r1 or r2 return callhttp(url3, data3); }).then(function(result3) { r3 = result3; // can access r1 or r2 or r3 });
在一个对象中累积结果
var results = {}; callhttp(url1, data1).then(function(result1) { results.result1 = result1; return callhttp(url2, data2); }).then(function(result2) { results.result2 = result2; // can access results.result1 or results.result2 return callhttp(url3, data3); }).then(function(result3) { results.result3 = result3; // can access results.result1 or results.result2 or results.result3 });
巢,所有以前的结果可以访问
callhttp(url1, data1).then(function(result1) { // result1 is available here return callhttp(url2, data2).then(function(result2) { // result1 and result2 available here return callhttp(url3, data3).then(function(result3) { // result1, result2 and result3 available here }); }); })
打破独立的链条,收集结果
如果链条的某些部分可以独立进行,而不是一个接一个地进行,那么你可以单独启动它们,使用Promise.all()
知道这些多个部分何时完成,然后你将从这些独立部分获得所有的数据:
var p1 = callhttp(url1, data1); var p2 = callhttp(url2, data2).then(function(result2) { return someAsync(result2); }).then(function(result2a) { return someOtherAsync(result2a); }); var p3 = callhttp(url3, data3).then(function(result3) { return someAsync(result3); }); Promise.all([p1, p2, p3]).then(function(results) { // multiple results available in results array // that can be processed further here with // other promises });