2017-10-04 55 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); 
 
});