javascript - 将变量定义为 let 和 var 显示 NaN
问题描述
我正在使用如下变量:
var maxId=1;
schema.table.max('id').then(function(max) {
maxId=max+1;
}).catch(err => {
maxId=1;
});
从数据库中获取最大 id 并添加一个。
console.log(maxId) //prints the maximum id.
我还想通过以下方式为新数据添加新 ID:
schema.table.findAll({where: option}).then((existed) => {
for (let insert of insertionList) {
insert['id'] = maxId;
maxId=maxId+1;
}
})
此处插入列表的 id 属性显示为 NaN 而不是 max 。
我使用了 let 和 var 但都导致了 NaN。任何帮助表示赞赏。
解决方案
这是一个通用的答案,不仅基于您写的内容。它将帮助您调试问题并编写更简洁的代码。在某个地方声明一个变量并在 Promise 中更改它是一种非常糟糕的做法,您可以创建一些不可预测的东西,并且它可以基于竞争条件。您阅读时的变量可能很容易未定义或其他东西。这一切都基于时间。
就像是:
var maxId=1;
schema.table.max('id').then(function(max) {
maxId=max+1;
}).catch(err => {
maxId=1;
});
可以很容易地翻译成:
const maxId = await schema.table.max('id')
.then(max => {
// here some checks on max (can it be null or undefined?)
return max + 1;
}, () => 1);
为了避免副作用,尽量使用“const”而不是“let”和“var”。如果您在大多数情况下被迫使用 let 或 var 意味着您做错了,尤其是在您使用 Promise 或异步代码时。
一个重要的考虑因素......
您所写的内容意味着错误将考虑 max == 1。应该以适当的方式处理抛出错误(或拒绝承诺)(不像您的示例,甚至不像我的示例......)。如果出现 I/O 问题或缺少权限,您使用的库可能会拒绝您的承诺。这些情况不应暗示 max = 1,但应报告它们以采取其他措施。
推荐阅读
- java - 在 SPARK 中的两个集群之间同步 HBase 表
- python-3.x - Dash 应用程序未在 gunicorn nginx wsgi 服务器上运行
- java - JDBC 等效于 hibernate.globally_quoted_identifiers
- oracle - 如何在 with 语句中提取值?
- sharepoint - 如果已经存在同名文件,是否有选择如何重命名我的文件的解决方案?
- java - 将 Hashmap 上的列表添加到另一个列表时出现问题
- excel - Excel VBA中.Delete和.Clear之间的区别?
- ag-grid - 如何实现查找列值并在 ag 网格中替换为新值(如查找和替换)
- c# - 未找到 Xamarin IOS 绑定库 DLL
- angular - 如何使用gridster 2强制添加项目