Как дождаться асинхронной функции и собрать ответ - PullRequest
2 голосов
/ 24 июня 2019

До сих пор я думал, await делает мою программу синхронной. Однако я вижу, что await ожидает только того, что функция async будет решена с обещанием, после чего все программы продолжат работать. Итак, как правильно ждать и собирать ответ от асинхронной функции?

Оригинальный код:

let result={
  name:'',
  country:''
};
const data = await query.getCachedData(did); 
result.name = data.name; // undefined
result.country = data.country;//undefined
console.log(result);

Я не знаю, почему, но ожидание результата асинхронной функции работает:

let result={
  name:'',
  country:''
};
const data = await query.getCachedData(did); 
result.name = await data.name; //'Jon'
result.country = await data.country;// 'US'
console.log(result);

Но я не уверен, что это решение.

Поскольку getCachedData возвращает обещание, я подумал, что это может быть правильным способом, но then() / catch() не выполнил.

query.getCachedData(did).then((tfnData) => {
  result.name = data.name; 
  result.country = data.country;
  console.log(result);
}).catch((dbError) => {
  console.log(dbError);
});

Может кто-нибудь поправить меня, чтобы получить result правильный путь?

Ответы [ 4 ]

1 голос
/ 24 июня 2019

Обещание - это возвращение асинхронной функции.Результат, возможно, еще не закончен.Вот почему вы можете ждать метод (как вы это сделали).Это установит возврат от функции, когда вычисление выполнено.

Или вы можете использовать 'then':

const data1 = await query.getCachedData(did);
//data1 has a value at this point of code

const data2;
querry.getChachedData(did).then((result)=>{data2 = result});
//data2 can have a value or will get one later (this is async) at this point of code

С помощью Promise all вы можете позволить нескольким методам работать асинхронно и ожидать всех одновременно.https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

const callStack = [];

const data1;
const data2;
callStack.push(query.getChachedData(did).then((result)=>{data1 = result}));
callStack.push(query.getChachedData(did).then((result)=>{data2 = result}));
//run both query Methods at asynchronous 
await Promise.all(callStack);
//data1 and data2 hava a value at this point of code
0 голосов
/ 24 июня 2019

До сих пор я думал, что ожидание делает мою программу синхронной

Async/await делает код похожим на синхронный, но за ним стоит синтаксический сахар для обещаний в Javascript. Действительно? Да

Это просто return thePromise().then(result => result)

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

Когда вы работаете с обещаниями, они не заставляют код Node.js работать синхронно, с другой стороны, обещания позволяют записывать потоки, которые выглядят синхронными.

Итак, как правильно ждать и получать ответ от асинхронной функции?

Согласно вашему примеру, код будет примерно таким:

const queryResult = did => query.getCachedData(did).then(tfnData => tfnData);

// Without async/await    
queryResult(did)
  .then(data => {
    const { name, country } = data;
    const result = { name, country };
    console.log(`${result.name}, ${result.country}`); // Jon, US
  })
  .catch(error => console.log(`Error produced: ${error}`));

// With async/await
(async () => {
  try {
    // ... Some other code ....
    // ... Some other code ....
    // ... Some other code ....

    const data = await queryResult(did);
    const { name, country } = data;
    const result = { name, country };
    console.log(`${result.name}, ${result.country}`); // Jon, US
  } catch (error) {
    console.log(`Error inside try-catch: ${error}`);
  }
})();
0 голосов
/ 24 июня 2019

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

То, что вы сделали с тогдашним ключевым словом, это то, что await сделал для вас.

Вы можете использовать все, что вам подходит, но async/await облегчает чтение вашего кода.

если это работает

result.name = await data.name; 

это означает, что name является асинхронной функцией получения, которую вы должны ждать , чтобы получить результат. Вы можете сделать это так же, как это data.name.then(name => doWhateverYouWantWithName(name)) или используйте ключевое слово await, как вы уже сделали - и это должно быть даже лучше.

0 голосов
/ 24 июня 2019

Вы правы, что await ожидает функции async для возврата обещания. Для вашего примера кода я бы предложил следующее:

let result={
    name:'',
    country:''
};

async function getData() {
    const data = await query.getCachedData(did);
    result.name = data.name; // 'Jon'
    result.country = data.country; // 'US'
    console.log(result);
}

await можно использовать только внутри функции async. Функция будет приостановлена ​​до получения обещания от query.getCachedData(), сохраняя этот ответ в const data, который затем можно использовать для задания имени и страны объекта result. Вы также можете просмотреть документы MDN для async и , ожидающих .

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