Цепочка условной выборки в javascript - PullRequest
1 голос
/ 06 августа 2020

Я хочу заполнить объект geoInfo, получая данные с 3 конечных точек, используя fetch, начальный объект выглядит так:

let geoInfo = {
    ip: null,
    user: null,
    country: null
};

Я буду вызывать эту функцию много раз, вот почему я хочу добавить условия: если установлен geoInfo.ip, он не должен запускать первую выборку, а если geoInfo.user установлен, он не должен запускать и вторую fetch. Как мне с этим справиться?

let geoInfo = {
  ip: null,
  user: null,
  country: null
};

// Get user info based on ip.
function getGeoInfo() {
  return new Promise((resolve, reject) => {

    let result = fetch('https://api.ipify.org?format=json')
      .then(function(response) {
        return response.json();
      })
      .then(function(data) {
        geoInfo.ip = data.ip;
        return fetch('https://www.iplocate.io/api/lookup/' + geoInfo.ip);
      })
      .then(function(response) {
        return response.json();
      })
      .then(function(data) {
        geoInfo.user = data;
        return fetch('https://restcountries.eu/rest/v2/alpha/' + geoInfo.user.country_code);
      })
      .then(function(response) {
        return response.json();
      })
      .then(function(data) {
        geoInfo.country = data;
      })
      .catch(function(error) {
        console.log('Request failed', error);
        reject(error);
      })

    result.then(function(response) {
      resolve(geoInfo);
    });
  });
}

getGeoInfo().then(res => console.log(res)).catch(err => console.log(err));

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Вы можете связать последующие запросы выборки внутри .then и добавлять условия в зависимости от того, были ли установлены предыдущие данные:

.then(function(data) { 
    geoInfo.ip = data.ip; 
    return fetch('https://www.iplocate.io/api/lookup/' + geoInfo.ip)
        .then(function(data) { 
            if (geoInfo.ip) return;
            return fetch('...and so on')
        }); 
})
1 голос
/ 06 августа 2020

Простой проверки значения должно быть достаточно, вы проверяете, было ли оно установлено раньше, а если нет, вы назначаете ему новое значение. Вот пример использования async/await

let geoInfo = {
  ip: null,
  user: null,
  country: null
};

async function getGeoInfo() {
    geoInfo.ip = geoInfo.ip || (await fetch('https://api.ipify.org?format=json').then(res => res.json())).ip;
    geoInfo.user = geoInfo.user || (await fetch('https://www.iplocate.io/api/lookup/' + geoInfo.ip).then(res => res.json()));
    geoInfo.country = geoInfo.country || (await fetch('https://restcountries.eu/rest/v2/alpha/' + geoInfo.user.country_code).then(res => res.json()));
    return geoInfo;
}

getGeoInfo().then(res => console.log(res)).catch(err => console.log(err));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...