7

我想使用新的 fetch api ( https://fetch.spec.whatwg.org/ ) 一次获取多个文件。原生可以吗?如果是这样,我应该如何利用承诺?

4

2 回答 2

8
var list = [];
var urls = ['1.html', '2.html', '3.html'];
var results = [];

urls.forEach(function(url, i) { // (1)
  list.push( // (2)
    fetch(url).then(function(res){
      results[i] = res.blob(); // (3)
    })
  );
});

Promise
  .all(list) // (4)
  .then(function() {
    alert('all requests finished!'); // (5)
  });

这是未经测试的代码!此外,它依赖于ES6Array.prototype.forEach的新Promise对象。这个想法是这样的:

  1. 循环遍历所有 URL。
  2. 对于每个 URL,使用fetchAPI 获取它,将返回的 Promise 存储在list.
  3. 此外,当请求完成时,将结果存储在results.
  4. 创建一个新的 Promise,当所有 Promiselist都解决时(即所有请求都完成)。
  5. 享受人满为患results
于 2015-04-16T13:57:03.133 回答
2

在 Kotlin 中实现Boldewyn 的解决方案时,我将其缩减为:

fun fetchAll(vararg resources: String): Promise<Array<out Response>> {
    return Promise.all(resources.map { fetch(it) }.toTypedArray())
}

在 JavaScript 中大致翻译为:

function fetchAll(...resources) {
    var destination = []
    resources.forEach(it => {
        destination.push(fetch(it))
    })
    return Promise.all(destination)
}

早些时候,我尝试使用map而不是forEach+ pushing 到一个新数组,但由于某种原因根本不起作用。

于 2018-12-22T03:01:33.733 回答