为什么异步等待不等待-Node.js

时间:2020-05-27 01:40:38

标签: node.js async-await

我有这个异步功能,应该在插入后记录返回的数据库记录。相反,节点会尝试在异步await函数从API返回数据之前记录该记录。

fn: async function(inputs) {

  let companyId = await tg.getCompanyIdByEmail(inputs.orderData.email)
  let newCompany = {};
  if (!companyId) {
    newCompany = await tg.createCompany(inputs.orderData)
    sails.log('new company id: ' + newCompany.id) // this line being called before await finishes above and throwing undefined error
  }

  return;

},

这是异步功能tg.createCompany()

async createCompany(orderData) {

  const companyType = orderData.business_name === "" ? 'consumer' : 'business';
  const companyName = companyType === 'consumer' ? `${orderData.first_name} ${orderData.last_name}` : orderData.company_name;

  let company = {
    company_type: companyType,
    name: companyName,
    email: orderData.email
  }

  request({
    method: 'POST',
    url: `${this.baseUrl}/companies/`,
    headers: this.headers,
    json: company
  }, (err, res, body) => {
    if (err) throw new Error('request error: ' + err);
    if (!body.company) throw new Error('API error: ' + body.message)
    sails.log('tg company created', body.company) //this is logging AFTER other function errors out as undefined
    return body.company;
  })
}

如何让该函数等待异步函数返回数据?

1 个答案:

答案 0 :(得分:1)

createCompany需要创建一个承诺并将其兑现。例如:

const createCompany = (orderData) => {
  return new Promise((resolve, reject) => {
    // ...
    // your existing code goes here.
    // Then inside the callback from request, call reject(err) on err,
    // and call resolve() when the result is good, i.e:
    // ...
    resolve(body.promise)
  })
}

现在您可以在createCompany上“等待”。