使用 Promise 从数据库中获取身份值

Posted

技术标签:

【中文标题】使用 Promise 从数据库中获取身份值【英文标题】:getting identity value from database using promises 【发布时间】:2019-04-14 10:30:01 【问题描述】:

我对 promises、axios 和 node-mssql 的世界还很陌生。所以我可能做错了。

我有一个 vue.js 应用程序,我正在尝试将记录插入表中。我希望使用 Promise 来获取我刚刚执行的插入的标识值的值。

插入部分可以正常工作,但取回并使用它却不行。

这是我的调用代码,它包含在 Try/Catch 中(以下错误):

            var addFamilyMemberRowObj;

            axios
              .get("http://localhost:5000/addMember?familyId="+ vm.familyId+"&memberName="+vm.memberName+"&isAdmin="+vm.isParent)
              .then(response => (vm.returnId = response.data))
              .then(console.log(vm.returnId["Data"][0].id))
              .then(vm.memberId =  vm.returnId["Data"][0].id)
               .then(
                 addFamilyMemberRowObj = 
                  arrIndex: vm.addFamilyRowIndex,
                  familyId: vm.familyId,
                  familyName: vm.familyName,
                  familyMemberName: vm.memberName,
                  memberId: vm.memberId,
                  isParent: vm.isParent
                
              )
              .then(vm.addFamilyRowArray.push(addFamilyMemberRowObj))
              .then(vm.addFamilyRowIndex = vm.addFamilyRowIndex + 1);  

您可能需要了解的一些事项。 returnId 是一个数组。我将在下面向您展示我的数据库代码。 vm.returnId["Data"][0].id 是我能看到的唯一获得价值的方法。

我已经在 promise 之外打印了这个值,它最终会返回一个值。这让我相信这可能是一个时间问题。

我的数据库代码如下:

app.get('/addMember', function(req,res)
    var data = 
              "Data":""
      ;

      try 
      
          const pool7 = new sql2.ConnectionPool(config, err => 
              pool7.request()
              .query("INSERT INTO Member (FamilyId, MemberName, isAdmin)VALUES("+ req.query.familyId +",'" + req.query.memberName + "', '" + req.query.isAdmin + "') SELECT SCOPE_IDENTITY() as id", (err, result) => 
                  data["Data"] = result.recordset;
                  console.log(data);

                  res.json(data);
              )
          )

       catch (err) 
          console.log("hasLogin: " + err)
           
);

调用此方法后,我已验证插入是否正常工作(并且 console.log 也 [从此代码] 打印出正确的值):

数据:[ id: 24 ]

当我从 vue 代码中查看 console.log 时,我收到以下消息:

“无法获取未定义或空引用的属性‘0’”

但是,正如我所提到的,如果我在 promise 之外打印出 vm.returnId["Data"][0].id,我最终会在后续调用中获得一个值(id 落后 1)。

就获取值而言,我知道语法是正确的,但在 promise 内部它不喜欢它。

我知道这有很多东西要解压。我可能做错了很多事情。如您所知,许多这些代码 sn-ps 直接来自示例。欢迎任何帮助。

【问题讨论】:

【参考方案1】:

问题的根源在于then 需要一个函数作为参数。 .then(console.log(vm.returnId["Data"][0].id)) 是一个错误的调用。

应该是.then(() => console.log(vm.returnId["Data"][0].id))

【讨论】:

这似乎解决了 id 问题。我是否必须为所有 .then 电话执行此操作?具体来说这个:.then(() =>( addFamilyMemberRowObj = arrIndex: vm.addFamilyRowIndex, familyId: vm.familyId, familyName: vm.familyName, familyMemberName: vm.memberName, memberId: vm.memberId, isParent: vm.isParent )) 是的,您必须全部更改。 .then 在 Promise 解决时执行一个传递给它的函数。更多主题在这里:devdocs.io/javascript/global_objects/promise/thendeveloper.mozilla.org/en-US/docs/Web/JavaScript/Guide/… 感谢您的回答和后续链接。很有帮助!

以上是关于使用 Promise 从数据库中获取身份值的主要内容,如果未能解决你的问题,请参考以下文章

如何从fetch获取响应值而不是没有值的promise?

如何从Promise的返回值中取到[[PromiseValue]] ?

如何在reducer中处理异步promise

使用promise设置一个变量以从回调函数中获取返回

Sails.js 控制器从 Promise 中获取数据

如何使用 fetch 从 Promise 回调中返回返回值? [复制]