2017-10-04 56 views
0

首先道歉,如果这是一个简单的问题来解决,但我第一次使用node-fetch和承诺的概念。我正在调用一个返回分页数据的API端点,所以我得到了多个链接以获取更多数据。使用Promise.all

我感到把所有的链接到一个数组处理这个,然后我想打电话给每个端点的阵列中,只是打印出来的数据到控制台现在

所以我的第一个电话是

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

因此,一旦这样做了,我有一个需要按顺序点击的网址数组,请问谁能给我一些指示,然后设置一个承诺,以击中每一个?或者我可以在我的循环中做些什么?

谢谢

+0

[解析承诺一个接一个(即序列)?(HTTPS的可能重复: //stackoverflow.com/questions/24586110/resolve-promises-one-after-another-ie-in-sequence) – alexmac

+0

创建一个将一个url作为参数的函数,并返回所需结果的承诺。然后递归地调用它。 – Bergi

回答

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 ... 
}); 
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提到,从someAction值应在情况下返回它是异步的(返回无极)。如果someAction是异步的,则它必须返回Promise

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

+0

如果它们是异步的,它将同时运行所有'someAction's,而不是等待前一个。 – Bergi

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 => { \t 
 
    console.log(results); 
 
});