返回 Promise Pending 的函数值

Posted

技术标签:

【中文标题】返回 Promise Pending 的函数值【英文标题】:Function value returning Promise Pending [duplicate] 【发布时间】: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 或 "" 【参考方案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 尚未解决。

【讨论】:

以上是关于返回 Promise Pending 的函数值的主要内容,如果未能解决你的问题,请参考以下文章

Promise 返回 undefined 和 status pending

useState 与异步函数返回 Promise <pending>

为啥我的函数返回 Promise <pending> [重复]

异步函数返回 Promise <Pending>

等待的 Promise 仍然返回 <pending>

前端基础知识---Promise