utility.fetchInfo()
返回一个Promise对象。我需要能够获取此Promise对象的值,并将其值赋给变量,然后我可以在我的代码中使用它。
目前,我可以愉快地将result
的值打印到控制台,但我需要能够将此值分配给myVal
。到目前为止,我已经尝试了很多东西,没有任何效果。
var myVal = utility.fetchInfo().then(result => console.log(result));
由于
答案 0 :(得分:3)
@dhilt说了什么但在promise回调函数中做了你的东西:
utility.fetchInfo().then(result => {
doSomethingWith(result);
});
如果您使用的是最新的Node或Babel,请使用async / await:
async myFunction () {
var myVal = await utility.fetchInfo();
}
答案 1 :(得分:1)
只需在回调函数
中进行分配即可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
答案 2 :(得分:1)
当您将值返回到另一个文件/函数并且您变得未定义时,因为您使用该值的另一个函数没有等待将值分配给变量。比如有两个函数
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 :(得分:0)
我认为您正在寻找的是一些花哨的 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);
})();
这将返回您想要的输出。