2016-05-18 54 views
1

我正在使用一个节点库,它允许进行简单的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

OK,请忽略的问题1 - 我还以为是打印结果_inside_它处理解决承诺的循环,但事实证明我不是,所以这是整个阵列 - 我发现,一旦我将多于一件事情推入'promises'。我的错。问题2仍然存在 - 这是达到预期结果的最佳方式吗? – dsl101

+2

避免['Promise' constructor antipattern](http://stackoverflow.com/q/23803743/1048572)! – Bergi

+0

请[编辑]您的问题,以显示您如何检查您的结果,或删除帖子中的第一个问题。 – Bergi

回答

2

感谢@Bergi的链接。这是我已经结束的代码,我认为它更清洁。我曾尝试过这样的事情,但一定是犯了一些错误,因为它未返回undefined到Promise.all()。但现在没有额外的承诺就很好地工作。

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

@ DSL101,往前一步不是你自己的答案,它可以是有用的.map()数据的阵列,以承诺的数组,然后将每个数据项与它对应的异步衍生的结果联系起来。

例如,您可能会从一些网址开始。

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 
}); 
+0

不错。事实上,就我而言,承诺并不是同质的,但这是一个很好的解决方案。 – dsl101

+0

一个留在你的后口袋里。 –