【发布时间】: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) => {不是异步的。将其更改为db.executeQuery(sqlQuery, null, async (err, result) => { -
永远不要将普通回调与 Promise 或
async/await混合使用。您将无法控制执行流程,因为普通回调不尊重承诺流程或错误传播。如果你想使用 Promise,那么在这个函数中你的所有异步操作只使用 Promise 接口。如果这是 mySql,您可以获得一个支持所有数据库操作的 Promise 的版本。然后,您可以使用async/await正确控制一切。
标签: node.js async-await