首先道歉,如果这是一个简单的问题要解决,但我第一次使用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循环中有什么东西吗?
由于
答案 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)
您可以通过以下方式实现这一目标:
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;