【问题标题】:Get the value of a promise and assign to variable获取 promise 的值并赋值给变量
【发布时间】:2018-03-03 11:58:14
【问题描述】:

utility.fetchInfo() 返回一个 Promise 对象。我需要能够获取这个 Promise 对象的值并将它的值分配给一个变量,然后我可以稍后在我的代码中使用该变量。

目前,我可以愉快地将result 的值打印到控制台,但我需要能够将此值分配给myVal。到目前为止,我已经尝试了很多东西,但没有任何效果。

var myVal = utility.fetchInfo().then(result => console.log(result));

谢谢

【问题讨论】:

  • 我认为这是因为 Promise 解析是异步的。我会使用 async 和 await 关键字。 const myVal = await utility.fetchInfo(); 为此,您必须将 async 添加到包含此行的函数中:async function funcName()。这样程序将在 await 行等待,直到 Promise 被解决,然后继续。

标签: node.js promise


【解决方案1】:

我认为您正在寻找一些花哨的 ES7 语法:

var myVal = (async () => {
    var data = await utility.fetchInfo();
    return data;
})();

(async () => {
    console.log(await myVal);
})();

请记住,console.log(myVal) 会以 Promise { <pending> } 结尾,因此您可以使用

(async () => {
    console.log(await myVal);
})();

这将返回您想要的输出。

【讨论】:

    【解决方案2】:

    当您将值返回到另一个文件/函数并且您得到未定义时,因为您使用该值的另一​​个函数没有等待将值分配给变量。比如有两个函数

    function1(){
       var x=desired_value
    }
    
    function2(){
       var y = x
    }
    

    现在 function1 可能需要一些时间来为 var x 分配期望值,并且 java 脚本不会等待,它将开始运行 function2,当您读取 y 的值时,您将得到未定义。

    为了解决这个问题,我们可以使用java脚本promise/await/async,从async函数返回值作为resolve。参考下面的例子

    async function1(){  //function1 should be async here for this to work
       return new Promise(function(resolve,reject){
           resolve(desired_value)
    });
    }
    

    以上函数可以写成

     async function1(){  //function1 should be async here for this to work
    
            return Promise.resolve(desired_value)
        }
    

    现在我们可以通过调用function1并使用await关键字在另一个函数中使用这个值

    function2(){
       var y = await function1();
    }
    

    现在它将等待 function1 完成,然后再将其值分配给 y。

    【讨论】:

      【解决方案3】:

      @dhilt 说了什么,但在 promise 回调函数中做你的事情:

      utility.fetchInfo().then(result => { 
        doSomethingWith(result);
      });
      

      如果您使用的是最新版本的 Node 或 Babel,请使用 async/await:

      async function myFunction () {
          var myVal = await utility.fetchInfo();
      }
      

      【讨论】:

      • 谢谢。我想我会尝试异步/等待选项。我按照建议在回调函数中移动了所有必要的代码,从而使事情正常进行。
      • 如何将回调中的result 分配给在获取之前初始化的变量。即我想对响应数据做更多的事情。
      • @BrianWiley 你不能干净地做到这一点。你必须在回调中做这些事情。如果您不喜欢回调的嵌套性质(称为回调地狱),请使用 async/await。
      • 谢谢,我一直在读这个。我来自 R Shiny world 发送数据帧。我想知道他们是否正在使用这两种方式进行处理。
      【解决方案4】:

      只需在回调的主体内进行分配

      utility.fetchInfo().then(result => { myVal = result; });
      

      视情况而定,例如,如果有一大块异步逻辑,最好将其提取到单独的函数中:

      let myVal; // undefined until myAsyncFunc is called
      
      const myAsyncFunc = (result) => { 
         console.log(result);
         myVal = result;
         // ...
      };
      
      utility.fetchInfo().then(myAsyncFunc); // async call of myAsyncFunc
      

      【讨论】:

      • 我试过这个,但是当我在我的代码中进一步使用 myVal 时,它的值为undefined
      • 这是因为 promise 调用的异步性质。使用 promise 结果的代码必须等待这个结果。最简单的方法是将您的代码移动到 promise-success 回调中。
      • 啊,所以在我看到这个之前,我将所有代码都移到了回调函数中,一切正常。 undefined 现在没有问题了。这是一种好的做法还是异步/等待“更好”?
      • 我最初认为undefined 是由于范围问题,但显然不是,这取决于异步性质。 Promises/callbacks 和 nodeJS 对我来说是新的 :)
      • 您的问题是功能(承诺)和命令(异步/等待)范式之间圣战的一部分。我投票支持承诺...如果您来自命令式世界(例如 C、Java 等),那么使用 async/await 可能会更简单...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多