以异步方式返回对象并在Node.js中等待

时间:2018-10-21 06:08:02

标签: node.js async-await

我是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

我该怎么做?

3 个答案:

答案 0 :(得分:2)

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

应该是:

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

虽然调用方函数未链接诺言,并且未使用await。如果数据库查询应按顺序执行,则应为:

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

如果应并行执行数据库查询,则应为:

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

答案 1 :(得分:1)

您为什么要在然后返回用户?可能可以通过这种方式完成

async function saveLineIntoDb(user) {
    let userStored = user;
    try {
        await db.result(pgp.helpers.insert(user, cs));

        return user; // return user

    } catch (error) {
        logger.error('saveIntoDatabase Error:', error);
    }
}

答案 2 :(得分:0)

saveLineIntoDb方法中,尝试返回await的结果:

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

(此功能,您无需使用async/await