首页 > 解决方案 > 将变量定义为 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。任何帮助表示赞赏。

标签: javascriptnode.jslet

解决方案


这是一个通用的答案,不仅基于您写的内容。它将帮助您调试问题并编写更简洁的代码。在某个地方声明一个变量并在 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,但应报告它们以采取其他措施。


推荐阅读