【问题标题】:Function value returning Promise Pending [duplicate]返回 Promise Pending 的函数值
【发布时间】:2019-12-23 05:40:22
【问题描述】:

有人可以帮我为什么我下面的代码会为 out 变量返回 Promise 挂起值吗?

var out = dbConn.connect().then(function (){
        var request = new sql.Request(dbConn);
        request.input("terminalId", sql.VarChar, terminalID).query("SELECT terminalContextKey from device_context where terminalId = @terminalId").then(function (result, recordSet) {
            dbConn.close();
            finalterminalkey = result.recordset[0].terminalContextKey;
            console.dir(JSON.stringify(finalterminalkey));
            Promise.resolve(recordSet);
            return JSON.stringify(finalterminalkey);


        }).catch(function (err) {
            console.log(err);
            dbConn.close();
        });

    }).catch(function (err) {
       console.log(err);
    });

    console.dir(out);
   return out;

【问题讨论】:

  • 这对我们来说太宽泛了。 “为什么我的代码做 X”问题对于 Stack Overflow 来说是题外话,没有研究。
  • @zix 通常我不会在代码格式类型之间进行更改,但我想这是因为在这种情况下有 6 个字符的限制。
  • .then() 中返回的任何内容都将产生一个新的承诺。将JSON.stringify(finalterminalkey) 分配给全局范围内的变量。
  • Why is my asynchronous function returning Promise { <pending> } instead of a value? 的可能重复项(假设您没有问为什么它不是 promise-resolved)
  • 我尝试分配给全局变量,但它返回了我分配的内容。假设 null 或 ""

标签: javascript node.js express


【解决方案1】:

.then.catch 都返回对新承诺的引用。这就是为什么你可以链接它们。因为您可能在调用 Promise 后立即记录它,所以它还没有解决并且仍然处于挂起状态。 This 是一个很好的资源,可以了解 Promise 是如何工作的。

【讨论】:

    【解决方案2】:

    JavaScript Promise 就像一个现实生活中的承诺。我举个例子:

    Person A 承诺 Person B 从商店买牛奶。

    现在Person A 必须等待Person B 才能获得牛奶。 Person A不知道牛奶什么时候到,或者牛奶永远不会到。

    JavaScript Promises 也是如此。它们最终会解决,但它们也可能引发错误。在这种情况下,您放入catch() 的代码将用于“捕获”错误。如果他们解决了,他们将运行then() 中的代码。

    您的变量out 是一个承诺。你必须把你的逻辑放在then()catch()

    当您返回 out 时,JavaScript 不知道 Promise 是否已经准备好/已解决。

    【讨论】:

    • 我会接受这个答案。几乎足够接近。你能指出我在做什么吗?
    • { var out = dbConn.connect().then(function (){ var request = new sql.Request(dbConn); request.input("terminalId", sql.VarChar, terminalID)。 query("SELECT terminalContextKey from device_context where terminalId = @terminalId") .then(function (out, err) { dbConn.close(); finalterminalkey = out.recordset[0].terminalContextKey; //console.dir(JSON.stringify (finalterminalkey)); }) });退出; }
    【解决方案3】:

    您必须使用.then.catch 语句,但它们返回一个新的promise 而不是原来的promise。不过,他们会很好。您可以检查副本以获取更多参考。当您使用out 时,如果您使用.then 语句(即promise 已解决时)和.catch 语句(即promise 失败时),则promise 尚未解决。

    【讨论】:

      猜你喜欢
      • 2020-07-09
      • 2017-10-16
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2021-08-04
      • 2020-06-08
      • 2018-08-19
      • 2021-01-03
      相关资源
      最近更新 更多