【问题标题】:Node.js async function not being recognized as a valid async functionNode.js 异步函数未被识别为有效的异步函数
【发布时间】:2020-03-25 11:31:12
【问题描述】:

我有这两个功能

async function movieExists(movie){
        return new Promise((resolve, reject) => {
            const sql = '...';

            con.query(sql, (err,result,fields) => {
                if(err)
                    throw err;
                else if(!result[0])
                    reject("Error");
                else
                    resolve(result[0].total);
            })
        })
}
async function addMovie(movie){
        return new Promise((resolve, reject) => {
            const sql = '...';
            const exists = await movieExists(movie); //Error on this line

            if(exists == 0){
                con.query(sql, (err,result,fields) => {
                    if(err)
                        reject("Error");
                    else   
                        resolve("Success");
                })
            }else
                resolve("Movie already exists");
        })
}

错误: SyntaxError: await 仅在异步函数中有效

节点版本 -> v10.16.0

**如果您对代码本身有任何建议,我很乐意听到。

【问题讨论】:

  • (resolve, reject) => { 那是不是异步的函数......它是一个 Promise 构造函数这一事实也表明你犯了 Promise 构造函数反模式......你已经有一些东西返回一个承诺......你不需要构造一个承诺
  • new Promise 行下移两行 - 问题已解决
  • 什么是con? NPM 上的大多数数据库连接库现在都提供基于 Promise 的 API。会为您省去很多麻烦,而且不会再有new Promise(...
  • 我实际上建议切换到具有内置承诺支持的数据库的 musql2 版本。然后,您可以对所有数据库操作使用 Promise。

标签: javascript node.js asynchronous async-await


【解决方案1】:

await 关键字直接在您传递给new Promise() 的函数内部,它不是异步的。

试着把它移到那个函数之外,像这样:

async function addMovie(movie){
  const exists = await movieExists(movie);
  return new Promise((resolve, reject) => {
    const sql = '...';
    // ...
  })
}

【讨论】:

  • 关于 Promise 反模式其他人正在谈论你可能想看看util.promisify()(在节点 8.0.0 中添加)
【解决方案2】:

第二个条件是错误的,因为在 Promise 中匿名函数不是 async 函数,你可以使用下面的代替,但这不是控制 async 顺序的好方法。

async function addMovie(movie){
        return new Promise(async (resolve, reject) => {
            const sql = '...';
            const exists = await movieExists(movie); //Error on this line

            if(exists == 0){
                con.query(sql, (err,result,fields) => {
                    if(err)
                        reject("Error");
                    else   
                        resolve("Success");
                })
            }else
                resolve("Movie already exists");
        })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2012-07-25
    • 1970-01-01
    • 2016-01-02
    • 2019-07-04
    • 1970-01-01
    相关资源
    最近更新 更多