使用Promise.all

时间:2017-10-04 09:13:37

标签: javascript promise

首先道歉,如果这是一个简单的问题要解决,但我第一次使用node-fetch和Promises的概念。我正在调用api端点,它返回分页数据,因此我获得了多个链接以获取更多数据。

我通过将所有链接放入一个数组来处理这个问题,然后我想调用数组中的每个端点,然后将数据打印到控制台中

所以我的第一个电话是

var urlArray = [];

fetch(`${BASE_URL}/leagues?api_token=${AUTH_TOKEN}`, { headers: headers })
.then(function(response){
  return response.json(); // pass the data as promise to next then block
})
.then(function(json){

  // Collect Paginated Results
  var number_of_pages = parseInt(json.meta['pagination']['total_pages']);
  for (i = 2; i < number_of_pages + 1; i++) {
    urlArray.push(`${BASE_URL}?page=${i}&api_token=${AUTH_TOKEN}`)
  }
})
.catch(function(error) {
  console.log(error);
});

所以一旦完成这个我有一系列网址我需要顺序点击,有人可以给我一些指示,请问如何设置一个承诺击中每一个?或者我可以在我的for循环中有什么东西吗?

由于

3 个答案:

答案 0 :(得分:1)

您可以使用Array.prototype.reduce创建Promise链,以便一个接一个地执行

urls.reduce((prev, item) => {
    return prev.then(() => {
        return someAction(item);
    })
}, Promise.resolve()).then(() => {
    console.log('All done');
}).catch((err) => {
    console.log(err);
});

修改

如Bergi所述,如果异步(返回Promise),则应返回someAction的值。如果someAction是异步的,则必须返回Promise

"use strict";
function someAction(i) {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			console.log(i);
			resolve(i);
		}, i*1000);
	});
}
const urls = [1,2,3,4,5];
urls.reduce((prev, item) => {
	return prev.then(() => {
		return someAction(item);
	})
}, Promise.resolve()).then(() => {
	console.log('All done');
}).catch((err) => {
	console.log(err);
});

答案 1 :(得分:0)

对不起,如果这是错的!

一开始,把:

var promise_array = [];
在for循环中

,替换为

for (i = 2; i < number_of_pages + 1; i++) {
  var url = `${BASE_URL}?page=${i}&api_token=${AUTH_TOKEN}`;
  urlArray.push(url);
  promise_array.push(fetch(url));
}

在功能结束时

Promise.all(promise_array).then(all_responses => {
   // .. pluck json, then continue ...
});

答案 2 :(得分:0)

您可以通过以下方式实现这一目标:

&#13;
&#13;
fetch(`${BASE_URL}/leagues?api_token=${AUTH_TOKEN}`, { headers: headers }).then(response => {
    var json = response.json();
    var numberOfPages = parseInt(json.meta['pagination']['total_pages']);
    var urlArray = [];
    for (i = 2; i < numberOfPages + 1; i++) {
      urlArray.push(`${BASE_URL}?page=${i}&api_token=${AUTH_TOKEN}`)
    }  
    var promises = urlArray.map(url => getSomethingByUrl(url));
    return Promise.all(promises);
}).then(results => {	 
    console.log(results); 
});
&#13;
&#13;
&#13;