如何在另一个异步函数中使用异步等待

Jac*_*con 6 asynchronous node.js

我有一个关于在另一个承诺中使用异步等待的问题。我有一个函数调用另一个函数来获取交易详细信息。

当我运行函数 LastTransactions 时,字段详细信息不显示结果。任何人都可以帮助我吗?

LastTransactions: async (transactionKey, page) => {

    const api = `https://api.pagar.me/1/payables?recipient_id=${transactionKey}&count=${totalResults}&page=${page}&api_key=${PagarmeApiKey}`;
    const response = await axios.get(api);

    transactions = response.data.map((item) => {

      return {
        id : item.id,
        transactionId : item.transaction_id,
        trxDetails : [transactionDetails(item.transaction_id)],
      }

    });

    return transactions;

  },
Run Code Online (Sandbox Code Playgroud)

和详细功能

async function transactionDetails(id){
    const response = await axios.get(`https://api.pagar.me/1/transactions/${id}?api_key=${PagarmeApiKey}`)
    const data = response.data;
    return data;
}
Run Code Online (Sandbox Code Playgroud)

got*_*to1 7

您需要利用该Promise.all方法获取一组承诺,并在每次对交易详细信息的单独调用完成后返回一个包含交易的数组。

async (transactionKey, page) => {
  const api = 
    `https://api.pagar.me/1/payables?recipient_id=${transactionKey}&count=${totalResults}&page=${page}&api_key=${PagarmeApiKey}`;
  const response = await axios.get(api);
  
  // create an array of promises and wait for
  // all of them to resolve before continuing
  const transactions = await Promise.all(
    response.data.map(async item => {
      const { id, transaction_id } = item;

      // get transaction details for each item in the array
      const trxDetails = await transactionDetails(transaction_id);

      return {
        id,
        trxDetails,
        transactionId: transaction_id,
      };
    })
  );
  return transactions;
};
Run Code Online (Sandbox Code Playgroud)

参考:


小智 0

由于transactionDetails(item.transaction_id)是异步的,因此您也需要等待它,否则它将立即返回,并且 trxDetails 将包含一个 Promise 对象,而不是 response.data。

尝试这个:

transactions = response.data.map(async (item) => {

      return {
        id : item.id,
        transactionId : item.transaction_id,
        trxDetails : [await transactionDetails(item.transaction_id)],
      }

    });
Run Code Online (Sandbox Code Playgroud)