我使用的节点库允许进行简单的http请求并返回一个承诺 - 这很好用,因为它允许多个并行生成,然后我再收集它们与Promise.all()
。但是,http请求只返回一个字符串,我需要知道一些关于每个请求的额外识别信息。所以我虽然这样做的一种方法是将一些东西从请求承诺链接起来并添加该信息。这是我到目前为止所获得的代码,显示一个这样的请求被添加到承诺数组中我将会这样做。稍后收集:
var promises = [];
promises.push(new Promise(function(resolve, reject){
ReqPromise('http://some.domain.com/getresult.php')
.then(function(reqResult) {
resolve({
source: 'identifier',
value: reqResult
});
});
}));
这就是我在结算时得到的承诺:
{
source: 'identifier'
value: 1.2.3.4
}
这是标记'的理想方式吗?承诺结果?或者有什么关于承诺我误解了哪些意味着我不需要像上面那样创造额外的承诺?请注意,ReqPromise
位于外部库中,因此很难使其获取额外参数并将其返回。
答案 0 :(得分:4)
感谢@Bergi的链接。这是我最终得到的代码,我同意这个代码更清晰。我曾经尝试过类似的东西,但是肯定犯了一些错误,因为它返回未定义到Promise.all()
。但是现在没有额外的承诺就能很好地工作。
promises.push(ReqPromise('http://some.domain.com/getresult.php').then(function(reqResult) {
return {
source: 'identifier',
value: reqResult
};
}));
答案 1 :(得分:3)
@ dsl101,比你自己的答案更进一步,.map()
一个数据数组到一个promises数组是有用的,然后将每个数据项与其相应的异步派生结果相关联。
例如,您可能会开始使用URL。
var data = ['http://path/0', 'http://path/1', 'http://path/2', ...];
var promises = data.map(function(url) {
return ReqPromise(url).then(function(reqResult) {
return {
'source': url,
'value': reqResult
};
});
});
Promise.all(promises).then(function(results) {
// each result has a .value and a corresponding .source (url) property
});