Как дождаться запроса в graphQL до fini sh, прежде чем продолжить? - PullRequest
0 голосов
/ 12 марта 2020

У меня есть код ниже, где я хочу завершить sh doSomethingFirst(), прежде чем продолжить с остальным кодом:

async doSomething() {
    const response = await doSomethingFirst(); // get the response from this first

    if(response) {
        // rest of the code
    }

}

async doSomethingFirst {
    const response = await client
        .query({
            query,
            fetchPolicy: "network-only",
            variables: {
                someVariable: value
            }
        })
        .then(response => {
            console.log(response);
        })
        .catch(err => {
            // error
        });
    return await response;    
}

Однако ответ в doSomething() возвращается как undefined. Что не так с этой структурой?

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Попробуйте, у меня нормально работает, если нет, может, проблема в другом месте, а данные не возвращаются и не соответствуют действительности?

async doSomethingFirst {
const response = await client
    .query({
        query,
        fetchPolicy: "network-only",
        variables: {
            someVariable: value
        }
    })
    .then(response => { return response.json();})
    .then(responseData => {console.log(responseData); return responseData;})
    .catch(err => {
        // error
    }); 

}

0 голосов
/ 12 марта 2020

Вы должны вернуть ответ. В любом случае, вы можете просто сделать что-то вроде этого:

doSomethingFirst() {
  return client
    .query({
      query,
      fetchPolicy: "network-only",
      variables: {
        someVariable: value
      }
    })
}

async doSomething() {
  try {
    const response = await doSomethingFirst();
    if (response) {
      // rest of the code
    }
  }
  catch (err) {
    console.log(err)
  }
}   

Несколько вещей, которые вы хотели бы знать:

  1. Внутри doSomethingFirst вы используете await, а также цепочку .then вам не нужно делать это, потому что они одинаковы.
  2. Я сделал doSomethingFirst не асинхронной c функцией, потому что, поскольку doSomething является асинхронной c функцией, вы можно просто вернуть обещание из doSomethingFirst и дождаться ответа внутри doSomething, а обработку ошибок можно выполнить с помощью блоков try-catch, как я сделал.
...