【问题标题】:Why is Await not working in async function?为什么 Await 不能在异步函数中工作?
【发布时间】:2020-10-04 00:50:49
【问题描述】:

我正在尝试在异步函数中使用 await。但是,我得到了错误

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

我不知道问题出在下面的代码中。

insertPayrollAllowance: async function(companyId, jobId, basicSalary, employeeId, payrollId) {

        return new Promise((resolve, reject) => {
            sqlQuery = "SELECT * from tblJobAllowances Where tblJobAllowances.companyId = '" + companyId + "' and tblJobAllowances.jobId = '" + jobId + "' and deleterec = 0 order by id"
            db.executeQuery(sqlQuery, null, (err, result) => {
                if (err) {
                    reject(err);
                } else {

                    for (var i = 0; i < result.length; i++) {

                        var insStatus = false;
                        var allowanceId = result[i].allowanceId
                        var allowanceName = await this.getAllowanceName(companyId, allowanceId);
                        var amountType = result[i].typeOfAmount;
                        var amount = result[i].amount;
                        var amountCredited;
                        var taxable = result[i].taxable;

                        if ($.trim(amountType) == "FIXED AMT") {

                            amountCredited = parseFloat(amount.toString().replace(/,/g, ''));


                        } else if ($.trim(amountType) == "% Of Income") {

                            amountCredited = (parseFloat(basicSalary.toString().replace(/,/g, '')) / 100) * parseFloat(amount.toString().replace(/,/g, ''));

                        };

                        var info = {
                            companyId: companyId,
                            employeeId: employeeId,
                            payrollId: payrollId,
                            allowanceName: allowanceName,
                            amountType: amountType,
                            amount: amount,
                            amountCredited: amountCredited,
                            taxable: taxable
                        }

                        sqlQuery = "INSERT INTO tblPayrollAllowanceDetails SET ?"
                        db.executeQuery(sqlQuery, info, (err, result) => {
                            if (err) {
                                insStatus = false;
                            } else {
                                insStatus = true;
                            }
                        });

                    };

                    resolve(insStatus);

                }
            });
        });

    }

如果有人能指出我收到此错误的原因,我会很高兴。任何帮助将不胜感激。

【问题讨论】:

  • 因为您不是在异步函数中。您在Promise 回调中。但是,如果它首先要做的是return new Promise(...),那么创建一个函数async 真的没有意义。
  • 匿名函数 db.executeQuery(sqlQuery, null, (err, result) =&gt; { 不是异步的。将其更改为db.executeQuery(sqlQuery, null, async (err, result) =&gt; {
  • 永远不要将普通回调与 Promise 或 async/await 混合使用。您将无法控制执行流程,因为普通回调不尊重承诺流程或错误传播。如果你想使用 Promise,那么在这个函数中你的所有异步操作只使用 Promise 接口。如果这是 mySql,您可以获得一个支持所有数据库操作的 Promise 的版本。然后,您可以使用async/await 正确控制一切。

标签: node.js async-await


【解决方案1】:

await 在另一个非异步函数中

 db.executeQuery(sqlQuery, null, (err, result) => {

在这个箭头函数里面 (err, result) => { 所以要修复它,只需像这样添加异步:

db.executeQuery(sqlQuery, null, async (err, result) => {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 2020-01-07
    • 2022-01-10
    • 2016-05-20
    • 2018-05-02
    相关资源
    最近更新 更多