Как заставить аксиос ждать запроса GET? - PullRequest
0 голосов
/ 14 февраля 2019

Привет У меня проблема с использованием axios / fetch GET с URL-адресом, в котором есть параметр, который повторяет цикл массива для своих значений

axios / fetch не следует порядку массиваи просто возвращает тот ответ, который придет первым.

Как бы это исправить?

const fetch = require("node-fetch");

algo = "eth" // algorithm for wtt

hashrate = ['250', '100', '50']

console.log(hashrate)


for (var i = 0; i < vhr.length; i++){

var wttURL = "https://whattomine.com/coins.json?" + algo + "=true" + "&factor%5B" + algo + "_hr%5D=" + hashrate[i]



fetch(wttURL)
.then((resp) => resp.json()) // Transform the data into json
.then(function(data) {
  console.log(data.coins.Ethereum.btc_revenue)
  })

Выходные данные для этого в настоящее время являются либо результатами для 250 (a), 100 (b) или 50 (c)

Так что в основном это будет либовыходить как

a, b, c (желательно)

b, c, a

a, c, b

c, b, a

и т. Д.

Но я хочу, чтобы он выводил в соответствии с порядком, поэтому он должен быть

a, b, c всегда

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Используйте Promise.all, чтобы сохранить порядок.

В цикле for я создаю три обещания выборки и затем создаю цепочку, чтобы получить ответ в формате json и отправить их в массив.

Наконец, я использую Promise.all для получения данных в предварительно определенном формате

const fetch = require("node-fetch");

algo = "eth" // algorithm for wtt

hashrate = ['250', '100', '50']

console.log(hashrate)

var fetchUrl =[]
for (var i = 0; i < vhr.length; i++){

return fetchUrl.push(fetch("https://whattomine.com/coins.json?" + algo + "=true" + "&factor%5B" + algo + "_hr%5D=" + hashrate[i]).then(response => response.json())
}


Promise.all(fetchUrl)
.then(function(data) {
  data.forEach(a => a.coins.Ethereum.btc_revenue)
  })
0 голосов
/ 14 февраля 2019

Вариант 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 до тех пор, пока обещание не будет выполнено.

0 голосов
/ 14 февраля 2019

Вы можете использовать рекурсию следующим образом:

function fetchRecursively(int currentStep, int n) {
    var wttURL = "https://whattomine.com/coins.json?" + algo + "=true" + "&factor%5B" + algo + "_hr%5D=" + hashrate[currentStep]
    fetch(wttURL)
        .then((resp) => resp.json()) // Transform the data into json
        .then(function(data) {
            console.log(data.coins.Ethereum.btc_revenue);
            if (currentStep < n) {
                fetchRecursively(currentStep + 1, n);
            }
        })
}

И заменить цикл:

for (var i = 0; i < vhr.length; i++){

var wttURL = "https://whattomine.com/coins.json?" + algo + "=true" + "&factor%5B" + algo + "_hr%5D=" + hashrate[i]



fetch(wttURL)
.then((resp) => resp.json()) // Transform the data into json
.then(function(data) {
  console.log(data.coins.Ethereum.btc_revenue)
  })

следующим:

fetchRecursively(0, vhr.length);
...