Вариант 1: Promise.all
Вкратце: вы можете использовать Promise.all () , если вам нужен конкретный заказ.Вы создаете массив, заполненный обещаниями, передаете его в Promise.all()
, и вы получите массив с разрешенными обещаниями.
const fetch = require("node-fetch");
algo = "eth" // algorithm for wtt
hashrate = ['250', '100', '50']
wttURL = [];
for (var i = 0; i < vhr.length; i++) {
wttURL.push(fetch("https://whattomine.com/coins.json?" + algo + "=true" + "&factor%5B" + algo + "_hr%5D=" + hashrate[i]))
}
Promise.all(wttURL)
.then(responses => responses.forEach(response => console.log(response)))
.catch(err => console.log(err));
Однако, это терпит неудачу по причине первого обещания, которое отклоняет.Поэтому, если у вас большой массив или вам нужно отобразить какие-либо данные, вы не должны использовать этот метод.Кроме того, это будет держать заказ только на клиенте!Ваш сервер не будет ничего знать о заказе, поскольку вызовы не выполняются по порядку.
Вариант 2: Асинхронное / Ожидание
Вместо этого можно использовать async/await
.Вы будете await
каждый результат, и если какой-либо из них потерпит неудачу, вас это не волнует, так как остальные все еще могут добиться успеха.Кроме того, ваш бэкэнд также сможет отслеживать заказ.
async function getData() {
for (var i = 0; i < vhr.length; i++) {
let wttURL = "https://whattomine.com/coins.json?" + algo + "=true" + "&factor%5B" + algo + "_hr%5D=" + hashrate[i]
await fetch(wttURL)
.then(resp => resp.json()) // Transform the data into json
.then(data => console.log(data.coins.Ethereum.btc_revenue))
.catch(err => console.log(err));
}
}
Этот подход сохраняет первоначальный заказ на клиенте и бэкэнде (если вы его регистрируете).Однако оно медленнее, чем первое решение, поскольку оно не продолжается со следующего fetch
до тех пор, пока обещание не будет выполнено.