我正在使用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 );
}
});
}
有一些模型用于从属承诺并将数据从一个传递到另一个。哪种方法效果最好取决于您是在下一个呼叫中仅需要先前的数据,还是需要访问所有先前的数据。以下是几种型号:
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
});
await
ES7中的序列由于promise链只是一种用于对异步操作进行排序的机制,因此在ES7中,您还可以使用await
,然后中间结果都可以在同一作用域中使用(也许比链接.then()
处理程序的单独作用域更简单):
async function someFunction(...) {
const r1 = await callhttp(url1, data1);
// can use r1 here to formulate second http call
const r2 = await callhttp(url2, data2);
// can use r1 and r2 here to formulate third http call
const r3 = await callhttp(url3, data3);
// do some computation that has access to r1, r2 and r3
return someResult;
}
someFunction(...).then(result => {
// process final result here
}).catch(err => {
// handle error here
});
问题内容: 我正在使用bluebird库,需要发出一系列HTTP请求,并且需要对下一个HTTP请求的某些响应数据。我建立了一个函数来处理我的请求。这需要一个URL和POST的正文。 我这样称呼它: 第一个请求获取一个API密钥,该密钥需要传递给第二个请求,依此类推。如何从第一个请求中获取响应数据? 更新 这是功能: 问题答案: 有一些模型用于从属承诺并将数据从一个传递到另一个。哪种方法效果最好取决
我正在使用bluebird库,需要发出一系列HTTP请求,并需要向下一个HTTP请求发送一些响应数据。我构建了一个名为的函数来处理我的请求。这需要一个url和一篇文章的正文。 我这样称呼它: 第一个请求获取需要传递给第二个请求的API密钥,依此类推。如何从第一个请求中获取响应数据? 更新 这是函数:
问题内容: 我已经将我的代码重组为promises,并建立了一个精彩的长期承诺链,其中包含多个.then()回调。最后,我想返回一些复合值,并且需要访问多个中间promise结果。但是,序列中间的分辨率值不在上次回调的范围内,如何访问它们? 问题答案: 当然,语言设计者也意识到了这个问题。他们做了很多工作,异步函数提案最终使它成为了 ECMAScript 8 您不再需要单个调用或回调函数,因为在异
我试图将我编译的简单共享库(libhello.so)链接到我的本机C++代码中。库libhello.so文件是: 1。Get13.h 2.get13.cpp Android文件是: 1。myapplication/jni/android.mk 问题是,在gradle构建过程中,我在文件native-lib.cpp中得到了这个错误: 我使用android NDK包中包含的make_standalon
问题内容: 我正在尝试建立一个共享库。让我们说libabc.so。它使用另一个.so文件,例如lib123.so(/ usr / local / lib中的一个lib)。现在我在我的应用程序中使用共享的liblibabc.so。说我的应用程序。我想知道我应该如何链接这些二进制文件?我不想直接将我的应用程序与lib123.so链接。my- app应该仅与libabc.so链接。我怎样才能做到这一点?
我试图通过URL(通过电子邮件等共享)启动我的原生应用程序。Android似乎只响应HTTP深度链接URL(例如。,http://myapp.com/stuff),并且iOS只响应非HTTP自定义深度链接URL(例如。,myapp://stuff).是否有人找到了一个解决方案,可以让两个操作系统打开同一个URL? 此外,iOS有可能使用HTTP深层链接URL吗?类似于http://youtu.be