向承诺结果添加额外数据

问题描述 投票:0回答:3

我正在使用一个节点库,它允许发出简单的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
位于外部库中,因此很难让它接受额外的参数并返回它们。

javascript promise
3个回答
11
投票

感谢@Bergi 提供的链接。这是我最终得到的代码,我认为它更干净。我以前曾尝试过类似的操作,但一定犯了一些错误,因为它返回 undefined 为

Promise.all()
。但现在工作得很好,没有额外的承诺。

promises.push(ReqPromise('http://some.domain.com/getresult.php').then(function(reqResult) {
    return {
        source: 'identifier',
        value: reqResult
    };
}));

10
投票

@dsl101,比您自己的答案更进一步,将一组数据转换为一组承诺,然后将每个数据项与其相应的异步派生结果关联起来可能很有用。

例如,您可以从 URL 数组开始。

.map()



1
投票
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 });

/

async
语法,可以在对象字面量中
await
实现承诺
这是@dsl101的答案重写为使用

await

/

async
await

这是@Roamer-1888 的

promises.push((async function() { return { source: 'identifier', value: await ReqPromise('http://some.domain.com/getresult.php') }; })());

函数也可以替换为箭头函数

编辑:请注意,在将 Promise 推入数组的情况下,必须首先调用该函数才能“成为”Promise。在

var data = ['http://path/0', 'http://path/1', 'http://path/2', ...]; var promises = data.map(async function(url) { return { 'source': url, 'value': await ReqPromise(url) }; }); var results = await Promise.all(promises)

的情况下,该函数由

.map
调用,因此它已经“成为”一个承诺
    

© www.soinside.com 2019 - 2024. All rights reserved.