- 此问题在此处已有答案**:
(17个答案)
七年前就关门了。
我正在使用bluebird库,需要发出一系列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密钥,这个密钥需要传递给第二个请求,以此类推。如何从第一个请求获得响应数据?
更新
这是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 );
}
});
}
1条答案
按热度按时间ars1skjm1#
**在2023年编辑。**现在我们在您执行的每个Javascript环境中都有
async/await
,这个问题的真实的答案是使用async/await
,因为它极大地简化了中间结果的收集和使用,并将其转换为可以在序列的任何部分使用的普通Javascript变量。这个答案的其他部分都写于2015年,当时async/await还没有广泛使用。有几种依赖承诺和将数据从一个传递到下一个的模型。哪一种最有效取决于你在下一次调用中是否只需要以前的数据,或者你是否需要访问所有以前的数据。下面是几种模型:
将一个结果馈送到下一个
将中间结果分配给更高范围
在一个对象中累积结果
嵌套,以便可以访问所有以前的结果
将链分解为独立的部分,收集结果
如果链中的某些部分可以独立进行,而不是一个接一个地进行,那么您可以分别启动它们,并使用
Promise.all()
来了解这些部分何时完成,然后您将拥有来自这些独立部分的所有数据:ES 7中
await
的序列由于承诺链只是一种对异步操作进行排序的机制,因此在ES 7中,您也可以使用
await
,然后中间结果都可以在同一个作用域中获得(可能比链式.then()
处理程序的单独作用域更简单):