首页 > 解决方案 > 异步返回对象并在nodejs中等待

问题描述

我是 Node.js 的新手,我有async一个名为

async function makeLineStringFromPoints(user) {
    ...

    for (let item of linesGeoJson) {
        saveLineIntoDb({
            'line': item,
            'date': user.date_created,
            'user_id': user.uid,
            'device_id': user.devid,
        }).then((userStored) => {
            console.log(userStored); // i received undefined  
        }).catch((err) => {
            console.log(err);
        });
    }
    ...
}

在此方法中,我在此方法中调用了其他异步方法saveLineIntoDb,我将用户信息存储在数据库中:

async function saveLineIntoDb(user) {
    let userStored = user;
    try {
        await db.result(pgp.helpers.insert(user, cs))
            .then(data => {
                return await (user); // return user
            });
    } catch (error) {
        logger.error('saveIntoDatabase Error:', error);
    }
}

现在存储后我想返回,user但我总是得到。saveLineIntoDb(user)}).then((userStored)undefined

我怎样才能做到这一点 ?

标签: node.jsasync-await

解决方案


saveLineIntoDb不返回结果并混合async和原始承诺。它还可以防止在调用函数中处理错误。return await (user)过多,它也不会起作用,因为它发生在常规函数中。

它应该是:

async function saveLineIntoDb(user) {
   await db.result(pgp.helpers.insert(user, cs));
   return user;
}

虽然调用者函数不链接承诺并且不使用await. 如果 DB 查询应该串行执行,它应该是:

async function makeLineStringFromPoints(user) {
  ...
  try {
    for (let item of linesGeoJson) {
      const userStored = await saveLineIntoDb(...);
      console.log(userStored);
    }
  } catch (err) {
    console.log(err);
  }
}

如果 DB 查询应该并行执行,它应该是:

async function makeLineStringFromPoints(user) {
  ...
  try {
    await Promise.all(linesGeoJson.map(async (item) => {
      const userStored = await saveLineIntoDb(...));
      console.log(userStored);
    }));
  } catch (err) {
    console.log(err);
  }
}

推荐阅读