Смотрите API для обновлений - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь заставить API следить за https://api.exchangeratesapi.io/latest и определять, есть ли какие-либо изменения, чтобы я мог обновлять своих клиентов так же, как уведомление о веб-ловушке. Но что делаю, это

while(true){
    fetch(https://api.exchangeratesapi.io/latest)
    .then(res => ......
}

Я кэширую результат и всегда проверяю, есть ли какие-либо изменения. Если есть, я отправлю запрос клиенту. Я ищу лучший способ извлечения данных вместо создания циклов while

1 Ответ

3 голосов
/ 03 августа 2020

Если вы используете while l oop, вы потенциально можете отправить много запросов, прежде чем один вернется. И даже когда кто-то вернется, это не обязательно будет в порядке. Вот краткий пример того, что может произойти, например, при скачке сети:

const sleep = ms => new Promise(res => setTimeout(res,  ms));

async function mockNetworkCall(num) { 
  const timings = [50, 150, 50]
  console.log(`sending request ${num}`);
  await sleep(timings[num]);
  
  console.log(`request ${num} finished`)
}


for(let i = 0; i < 3; i++) {
  mockNetworkCall(i);
}

Вы можете избежать while l oop, если вместо этого воспользуетесь подходом, чтобы выполнять новый запрос только после завершения последнего. В этом случае у вас будет активен только один запрос в любой момент времени, и вы знаете, что получаете результат по порядку.

Вы можете обернуть logi c для этого в простой функции, чтобы смотреть URL-адрес и повторно инициировать запрос только после завершения предыдущего. Это скелет для такой функции - возможно, потребуется настроить его в соответствии с вашими потребностями:

function watch({ url, retryCount, lastResponse = null}) {
  fetch(url)
    .then(res => { 
      
      /* do something */
      
      return res;
    })
    .then(res => watch({url, retryCount, lastResponse: res})) //launch again
    .catch(err => { 
      /* handle error */ 
      console.error("error getting URL", err);
      console.warn("retries left: ", retryCount);
      
      if (retryCount-- > 0) {
        watch({url, retryCount, lastResponse});
      }
    })
}

watch({url: "google.com", retryCount: 3});

Или то же самое, используя async/await

async function watch({ url, retryCount, lastResponse = null}) {
  try {
    const res = await fetch(url);

    /* do something */
    
    watch({url, retryCount, lastResponse: res}); //launch again
  } catch (err) {
    /* handle error */ 
    console.error("error getting URL", err);
    console.warn("retries left: ", retryCount);
      
    if (retryCount-- > 0) {
      watch({url, retryCount, lastResponse});
    }
  }
}

watch({url: "google.com", retryCount: 3});
...