【问题标题】:how to return an object without using await如何在不使用 await 的情况下返回对象
【发布时间】:2019-11-06 10:41:13
【问题描述】:

我不是异步 gal,也不是专家级的 node.js 程序员。

我不知道如何返回我发布的新添加记录。

  person.POST(personObject).then(
    (result) => {
      console.log('Result', result); //undefined
      res.send(result)
    },
    (error) => {
      log.error(error, error.message);
      res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ error: 'Internal Server Error' }); 
    })

发布:

module.exports = async (aPerson) => {
  Person.create(aPerson)
  .catch((err) => {
    throw err
  })
  .then((newPerson) => {
    console.log('newPerson: ',newPerson); //this has a value
    return newPerson;
  })

  //works but does this kill the advantage of async???
  // const result = await Person.create(aPerson);
  // return result;
};

newPerson 是通过 sequalize 新创建的记录。

吉娜

【问题讨论】:

  • 您能澄清一下您的问题吗?
  • Person.create 前面放置一个return。另外,我会说注释掉的部分是首选(更具可读性)。
  • 异步一直是异步的。您不能返回异步值而不等待它解决。任何依赖于异步值的东西都会变成异步的。此外,您在哪里遇到问题也不是很清楚。是不是不想用Promise?此外,您现在拥有的“POST”不会返回任何内容,因为它不会返回 Person.create(aPerson) 假设返回的 Promise。
  • 注释掉的部分在功能上也等同于添加return 语句的部分。
  • 我想在“res.send(result)”中使用返回值,我有then中的值但我没有res.send中使用的值。

标签: node.js sequelize.js


【解决方案1】:

首先,您的代码的问题是您没有返回 Promise。要解决这个问题,您所要做的就是返回 Promise。那看起来像

module.exports = (aPerson) => {
  return Person.create(aPerson)
  // Catch isn't necessary, but I'm adding it to show the async/await equivalent.
  .catch((err) => {
    throw err
  });
};

不过,async/await 周围似乎有些混乱,所以我想澄清一些事情。上面的函数和

完全一样

module.exports = async (aPerson) => {
  try {
    return await Person.create(aPerson);
  } catch (err) {
    throw err;
  }
}

async/await 只是 Promises 的语法糖。它有助于使代码可读。如果您将上述任何一个 sn-ps 插入您的代码,它们的功能将相同。

【讨论】:

    【解决方案2】:

    问题是您的 POST 函数没有返回 Promise ,这将解决您的结果。由于您的函数中没有 return 语句,因此由于 async 声明而退出时,它将返回一个简单的 Promise.resolve() ,但这不是您想要的。您想返回一个实际的Promise,其resolve 将包含数据。这是一个说明它的实现:

    module.exports = (aPerson) => {    // <-- no async neeeded
      return Person.create(aPerson)    // <-- return the Promise here
      .then((newPerson) => {
        console.log('newPerson: ',newPerson); //this has a value
        return newPerson;
      })
      .catch((err) => {
        throw err;
      })
    };
    

    注意几点:

    • 函数不再有async。仅当您想在函数中使用 await 时才需要这样做,而您不会这样做。
    • 函数现在返回PromisePerson.create().then() 返回。

    我还将.catch 移动到.chain 的末尾,因为如果链的任何部分抛出异常或返回未处理的拒绝,它将被跳转到。这里.catch 除了重新抛出之外什么都不做,所以不是真的需要,但如果你想对错误做点什么,你可以。

    【讨论】:

    • 感谢您的回答,但 c1moore 在评论中首先回答了。
    猜你喜欢
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多