Цепочка асин c вызовов, где последний вызов сравнивает что-то с первым - PullRequest
0 голосов
/ 13 марта 2020

Мне нужно выполнить несколько запросов на выборку, каждый из которых зависит от успешного завершения последнего. Для окончательного запроса мне нужно сравнить значение из первого запроса.

Вот что у меня есть, и, похоже, оно работает, но я не уверен, правильно ли я на 100%.

const getData = async ( id ) => {
    return await fetch(`https://jsonplaceholder.typicode.com/todos/${id}`)
    .then( json => json.json() )
    .then( res => res )
}

const res_1 = await getData( 1 ).then( res => res )
const res_2 = await getData( res_1.id + 1 ).then( res => res )
const res_3 = await getData( res_2.id + 1 ).then( res => res )
const res_4 = await getData( res_3.id + 1 ).then( res => res )

console.log(`RES_1: \n${JSON.stringify(res_1)}`)
console.log(`RES_2: \n${JSON.stringify(res_2)}`)
console.log(`RES_3: \n${JSON.stringify(res_3)}`)
console.log(`RES_4: \n${JSON.stringify(res_4)}`)

if ( res_1.id !== res_4.id ) {
    console.log("Id's don't match")
} else {
    console.log("Id's match")
}

Вы можете игнорировать ведение журнала, это просто чтобы визуализировать, что происходит.

1 Ответ

1 голос
/ 13 марта 2020

Вам не нужны дополнительные .then( res => res ), поскольку он просто возвращает тот же объект снова. Кроме того, поскольку вы используете async / await, вы можете удалить .then(...) и просто await в результате обещания. Кроме того, мы можем использовать await только внутри функции async, поэтому вы можете поместить все свои логи c внутри функции asyn c fn, например:

const getData = async(id) => {
  const res = await fetch(`https://jsonplaceholder.typicode.com/todos/${id}`)
  return res.json();
}

async function fn() {
  const res_1 = await getData(1)
  const res_2 = await getData(res_1.id + 1)
  const res_3 = await getData(res_2.id + 1)
  const res_4 = await getData(res_3.id + 1)
  
  console.log('res_1.id: ', res_1.id);
  console.log('res_4.id: ', res_4.id);
  
  if (res_1.id !== res_4.id) {
    console.log("Id's don't match")
  } else {
    console.log("Id's match")
  }
}

fn();

Или, вы также можете использовать для этой цели выражения asyn c с немедленным вызовом, например:

const getData = async(id) => {
  const res = await fetch(`https://jsonplaceholder.typicode.com/todos/${id}`)
  return res.json();
}

(async function() {
  const res_1 = await getData(1)
  const res_2 = await getData(res_1.id + 1)
  const res_3 = await getData(res_2.id + 1)
  const res_4 = await getData(res_3.id + 1)

  console.log('res_1.id: ', res_1.id);
  console.log('res_4.id: ', res_4.id);

  if (res_1.id !== res_4.id) {
    console.log("Id's don't match")
  } else {
    console.log("Id's match")
  }
}());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...