【问题标题】:How to store the resolved value of a promise inside a variable?如何将 promise 的解析值存储在变量中?
【发布时间】:2020-07-17 16:49:23
【问题描述】:

我正在使用 NodeJs v10.19.0 我已经阅读了大量 async/await 文档和教程,但仍然无法正确理解。

我不断向 API 发出获取请求,该请求为我提供了一些 JSON 数据,我希望这些数据在变量中随时可用

我该怎么做?

到目前为止,我已经尝试过以下示例,但没有成功

感谢您的考虑

const rp = require('request-promise');
const myURL =  '{A_GET_URL_THAT_RETURNS_A_JSON}';
const options = {uri:myURL, json: true};

const data = ( async ()=>{
    try{
       return await rp(options)
    }catch (e) {
        console.log('error \n' + e.stack);
    }
})();

console.log(data);  // this gets me: "Promise { <pending> }"  instead of the json data

我尝试了几种语法,但仍然无法使其工作,也没有意识到我的缺陷在哪里

为什么我不能得到这个的解析值?

【问题讨论】:

    标签: javascript node.js promise async-await


    【解决方案1】:

    async 函数总是返回一个承诺。这就是为什么 data 在您的情况下是一个承诺。这是意料之中的。

    async 函数中的 return 值成为它返回的承诺的解析值。所以,你得到的 promise 的解析值就是你想要的值。

    调用async 函数时,需要使用.then()await 从返回的promise 中获取值。

    const promise = ( async ()=>{
        try{
           return await rp(options)
        }catch (e) {
            console.log('error \n' + e.stack);
        }
    })();
    
    promise.then(val => {
        console.log(val);
    }).catch(err => {
        console.log(err);
    });
    

    await 只有在使用它的异步函数内部才真正有用。当async 函数正在执行时,在它遇到第一个await 时,该函数立即返回一个待处理的promise,调用者立即得到该promise。函数体的进一步执行将暂停,直到您等待的承诺解决。当该承诺解决并且事件循环空闲时,该函数将继续执行。当函数最终返回时,它已经返回的 Promise 将从您的代码指定为返回值的任何内容中获得一个已解析的值。

    此外,return await fn() 没有任何用处。它生成与 return fn() 相同的结果。无论哪种方式,该函数都已经返回了一个 Promise,而您使用 return 指定的内容将成为已经返回的 Promise 的解析值。如果你指定了一个承诺,那么它的解析值就是这个值。

    【讨论】:

    • 您好,非常感谢您的回答。它澄清了很多,但我仍然不知道如何使返回值在变量中可访问,这是我的主要目标。我意识到我的问题不够清楚,所以我只是稍微编辑了一下。再次感谢
    • @OscarOrtizGarcía - 我再说一遍。您只能通过在返回的承诺上使用.then()await 来访问async 函数的返回值。这些是你的选择。您不能直接将返回值分配给变量 - 因为当您这样做时,您将得到的只是承诺。函数不能直接返回 Javascript 中异步操作的结果,因为该函数在异步结果可用之前返回。您需要调整代码设计以适应 Javascript 中异步操作的工作方式。
    猜你喜欢
    • 1970-01-01
    • 2016-10-23
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    相关资源
    最近更新 更多