0

我正在使用Promises构建一个模块,我在多个 url上进行多次 http 调用,解析响应,然后再次进行更多 http 调用。

c = new RSVP.Promise({urls:[]}) //Passing a list of urls
c.then(http_module1) // Call the http module
.then(parsing_module) // Parsing the responses and extract the hyperlinks
.then(http_module2) // Making http requests on the data produced by the parser before.
.then(print_module) // Prints out the responses.

问题是 - 如果我使用承诺,除非发出所有 http 请求,否则我无法解析模块。这是因为 -Once a promise has been resolved or rejected, it cannot be resolved or rejected again.

构建我自己的承诺版本还是有替代方法?

4

2 回答 2

2

你可以编写函数来返回你的 Promise 句柄,并创建仍可链接的可重用部分。例如:

function getPromise(obj){
   return new RSVP.Promise(obj);
}
function callModule(obj){
   return getPromise(obj).then(http_module1);
}

var module = callModule({urls:[]})
  .then(getFoo())
  .then(whatever());

  //etc
于 2014-04-20T17:43:42.487 回答
0

有些库支持这种管道/流,您不需要自己构建。

然而,这项任务似乎也可以通过承诺来完成。只是不要对一组 url 使用单个 promise,而是使用多个 promise - 每个 url 一个:

var urls = []; //Passing a list of urls
var promises = urls.map(function(url) {
    return http_module1(url) // Call the http module
      .then(parsing_module) // Parsing the responses and extract the hyperlinks
      .then(http_module2) // Making http requests on the data produced by the parser before.
      .then(print_module); // Prints out the responses.
});

这将并行运行所有这些。要等到它们运行完毕,请使用RSVP.all(promises)以获得对结果的承诺,另请参阅https://github.com/tildeio/rsvp.js#arrays-of-promises

于 2014-04-20T17:42:50.393 回答