繁体   English   中英

循环中的异步调用延迟

[英]Async calls in loop delayed

我有一个 function 在循环内对数据库进行两次异步调用。 问题是返回 function 在检索来自循环的数据之前起作用。

const myFunc = async (customers) => {
  const customerList = customers.map(async (customer) => {
    const cashCollected = await knex('cash_collections')
      .sum('amount_collected as amount')
      .where('account_code', customer.code)
      .first();
    const orderValue = await knex('orders')
      .sum('discounted_price as amount')
      .where('customer_id', customer.id)
      .first();
    const customerData = {
      name: customer.name,
      outstandingBalance: (orderValue.amount - cashCollected.amount),
    };
    // This line works after console.log(customerList);
    console.log(customerData);
    return customerData;
  });
   // console and return works before data is retrieved 
   // (before console.log(customerData) is run)
  console.log(customerList);
  return customerList;
};

// Function is called in another place
myFunc()

您可以通过在map回调中并行执行所有这些调用。 如果您真的想这样做,则需要使用Promise.all等待这些呼叫解决:

const customerList = await Promise.all(customers.map(async (customer) => {
    // ...
}));

如果您想连续执行它们,请使用for循环并等待每个响应。 :-) 但看起来并行是可以的。

您需要await map ,然后它将等待它,否则异步不会使其等待它实际上意味着它将go 进入下一个代码,除非您告诉它await like so: const customerList = await customers.map.... Now since map does not return a promise you would need to wrap it in a promise either with Promise.all or an individual promise.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM