Node.js 获取承诺的值并分配给变量
Node.js 获取承诺的值并分配给变量,node.js,promise,Node.js,Promise,utility.fetchInfo()返回承诺对象。我需要能够得到这个Promise对象的值,并将它的值赋给一个变量,以便以后在代码中使用 目前,我可以愉快地将result的值打印到控制台,但我需要能够将该值分配给myVal。到目前为止,我已经尝试了很多东西,但都没有效果 var myVal=utility.fetchInfo().then(result=>console.log(result)) 谢谢只需在回调函数体中执行赋值 utility.fetchInfo().then(result =
utility.fetchInfo()
返回承诺对象。我需要能够得到这个Promise对象的值,并将它的值赋给一个变量,以便以后在代码中使用
目前,我可以愉快地将result
的值打印到控制台,但我需要能够将该值分配给myVal
。到目前为止,我已经尝试了很多东西,但都没有效果
var myVal=utility.fetchInfo().then(result=>console.log(result))代码>
谢谢只需在回调函数体中执行赋值
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
@dhilt说了些什么,但在promise回调函数中做了些什么:
utility.fetchInfo().then(result => {
doSomethingWith(result);
});
如果您使用的是Node或Babel的最新版本,请使用async/await:
async function myFunction () {
var myVal = await utility.fetchInfo();
}
当您将该值返回到另一个文件/函数时,由于使用该值的另一个函数没有等待将该值分配给该变量,因此您将无法定义该值。例如,有两个函数
function1(){
var x=desired_value
}
function2(){
var y = x
}
现在,function1可能需要一些时间才能将期望值分配给var x,java脚本将不再等待,它将开始运行function2,当您读取y的值时,您将得到未定义的值
为了解决这个问题,我们可以使用java脚本promise/await/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并使用wait关键字
function2(){
var y = await function1();
}
现在,它将等待函数1完成,然后再将其值赋给y。我认为您需要的是一些奇特的ES7语法:
var myVal=(异步()=>{
var data=await utility.fetchInfo();
返回数据;
})();
(异步()=>{
console.log(等待myVal);
})();
请记住console.log(myVal)
将以Promise{}
结束,因此您将使用
(异步()=>{
console.log(等待myVal);
})();
这将返回所需的输出。我认为这是因为Promise resolve是异步的。我会使用async和wait关键字const myVal=wait utility.fetchInfo()
要使其正常工作,必须将async添加到包含此行的函数中:async function funcName()
。这样,程序将在等待行上等待,直到承诺得到解决,然后继续。我尝试了这种方法,但当我在代码中进一步使用myVal时,它的值是未定义的,这是因为承诺调用的异步性质。使用承诺结果的代码必须等待此结果。最简单的方法是将代码移到promise success回调函数中。啊,在我看到这一点之前,我将所有代码移到回调函数中,一切正常。现在未定义的没有问题。这是一个好的实践还是异步/等待“更好”?我最初认为未定义的是由于范围问题,但显然不是,这取决于异步的性质。承诺/回调和nodej对我来说是新的:)你的问题是功能(承诺)和命令(异步/等待)范式之间圣战的一部分。我投票赞成承诺。。。如果您来自命令式世界(例如C、Java等),那么使用async/await可能会更简单……谢谢。我想我将尝试使用async/wait选项。我已经按照建议在回调函数中移动了所有必要的代码,这一切都正常工作。如何将回调函数中的结果
分配给在获取之前初始化的变量。i、 e.我想用响应数据做更多的事情。@BrianWiley你不能干净利落地这么做。你必须在回调中做这些事情。如果您不喜欢回调的嵌套特性(称为回调地狱),那么请使用async/await.Thank,我已经读过了。我是从R Shining world发送数据帧来的。我想知道他们是否在处理这两种方式。