dsl*_*101 7 javascript promise
我正在使用一个节点库,它允许发出简单的 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
});
});
}));
Run Code Online (Sandbox Code Playgroud)
这就是我在解决这个承诺时得到的回报:
{
source: 'identifier'
value: 1.2.3.4
}
Run Code Online (Sandbox Code Playgroud)
这是“标记”承诺结果的理想方式吗?或者我对承诺有什么误解,这意味着我不需要像上面那样创建额外的承诺?请注意,这ReqPromise是在一个外部库中,因此很难让它接受额外的参数并返回它们。
感谢@Bergi 提供链接。这是我最终得到的代码,我同意它更清晰。我以前尝试过这样的事情,但一定犯了一些错误,因为它返回 undefined 到Promise.all(). 但现在工作得很好,没有额外的承诺。
promises.push(ReqPromise('http://some.domain.com/getresult.php').then(function(reqResult) {
return {
source: 'identifier',
value: reqResult
};
}));
Run Code Online (Sandbox Code Playgroud)
@dsl101,比您自己的答案更进一步,将.map()数据数组转换为承诺数组可能很有用,然后将每个数据项与其相应的异步派生结果相关联。
例如,您可以从一系列 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
});
Run Code Online (Sandbox Code Playgroud)