Javascript循环中的承诺
我试图理解承诺,但我发现自己陷入了一个反复使用wait和async的循环中 我的理解是,在函数之前添加async关键字,可以指示函数始终返回承诺 我有一个函数,它读取一个文件并返回一个承诺,名称是getDataFromFile() 我希望在数据解析后能够从中获取数据,所以不要使用解析,而是拒绝使用wait async的新承诺 等待后,当承诺返回时,我希望获取数据并将其分配给DataFromPromise变量Javascript循环中的承诺,javascript,asynchronous,promise,async-await,Javascript,Asynchronous,Promise,Async Await,我试图理解承诺,但我发现自己陷入了一个反复使用wait和async的循环中 我的理解是,在函数之前添加async关键字,可以指示函数始终返回承诺 我有一个函数,它读取一个文件并返回一个承诺,名称是getDataFromFile() 我希望在数据解析后能够从中获取数据,所以不要使用解析,而是拒绝使用wait async的新承诺 等待后,当承诺返回时,我希望获取数据并将其分配给DataFromPromise变量 let DatafromPromise = {}; const loadDataPr
let DatafromPromise = {};
const loadDataPromise = async () => { // Since its async, it seems like its returning a promise too
try {
const myPromise = getDataFromFile();
DatafromPromise = (await myPromise).value;
//console.log(DatafromPromise); // This has value
} catch (error) {
console.log(error);
}
};
loadDataPromise();
console.log(DatafromPromise); // This is empty? Why?
如果我把await loadDataPromise()放在一起,我也必须把整个代码块放在async上,现在看到这把我放在了await/async的循环中
getDataFromFile已返回承诺。
然后我添加了const loadDataPromise,这是一个返回承诺的const函数。。
然后,如果我添加wait loadDataPromise,我会觉得我在一个返回承诺的循环中,而没有实际获得数据
在代码中的哪一点上,承诺得到了解决,价值得到了分配
非常感谢您的帮助。您没有等待
加载数据承诺()
的结果。它在实际填充DatafromPromise
变量之前很久就返回了一个承诺。因此,您试图在异步代码完成并填充变量之前读取变量
let DatafromPromise = {};
const loadDataPromise = async () => { // Since its async, it seems like its returning a promise too
try {
const myPromise = getDataFromFile();
DatafromPromise = (await myPromise).value;
//console.log(DatafromPromise); // This has value
} catch (error) {
console.log(error);
}
};
loadDataPromise();
console.log(DatafromPromise); // This is empty? Why?
顺便说一句,这种“副作用编码”并不是编码的好方法。如果loadDataPromise()
想要传回一个完成值,它应该只返回该值,该值将是它返回的承诺的解析值,调用方可以使用访问该值。然后()
或等待
也许是这样的:
const loadDataPromise = async () => {
const result = await getDataFromFile();
return result.value; // will be resolved value of returned promise
};
loadDataPromise().then(val => {
console.log(val);
}).catch(err => {
console.log(err);
});
当然,这是假设
getDataFromFile()
也正确返回了一个承诺,该承诺在异步操作完成时解析为所需的值。谢谢jfriend00,所以我理解您的说法,即我正在尝试在为DataFromPromise赋值之前填充其值。您的代码确实有帮助,但我正在尝试使用then、catch和WAIT以及异步来替换读取值。如何使用wait获得result.value,因为如果我添加wait,我需要在外部块中添加asyn,使其再次成为承诺返回?@Sarah-是的,您只能在异步函数中使用wait,因此调用函数需要异步才能使用wait.Gotcha,因此,似乎结果值的使用或消耗需要在异步函数中处理得过于正确,比如在UI上显示从文件读取的值。也许在数组或字典中添加这些值并显示它们?@Sarah-我不确定你在最后的评论中是否问了一个问题?您可以在async
函数中使用wait
,也可以使用.then()
,它不需要在async
函数中。这是否已经回答了您原来的问题?很抱歉,jFriend00的答复太晚了。是的,我在问一个问题。就像我上面的例子。DatafromPromise=(等待myPromise).value//console.log(DatafromPromise);//这是有值的,我应该在loadDataPromise函数中使用这里返回的值。无论哪种方式,如果我需要使用该值,它都需要在异步函数中正确吗?