Javascript循环中的承诺

Javascript循环中的承诺,javascript,asynchronous,promise,async-await,Javascript,Asynchronous,Promise,Async Await,我试图理解承诺,但我发现自己陷入了一个反复使用wait和async的循环中 我的理解是,在函数之前添加async关键字,可以指示函数始终返回承诺 我有一个函数,它读取一个文件并返回一个承诺,名称是getDataFromFile() 我希望在数据解析后能够从中获取数据,所以不要使用解析,而是拒绝使用wait async的新承诺 等待后,当承诺返回时,我希望获取数据并将其分配给DataFromPromise变量 let DatafromPromise = {}; const loadDataPr

我试图理解承诺,但我发现自己陷入了一个反复使用wait和async的循环中

我的理解是,在函数之前添加async关键字,可以指示函数始终返回承诺

我有一个函数,它读取一个文件并返回一个承诺,名称是getDataFromFile()

我希望在数据解析后能够从中获取数据,所以不要使用解析,而是拒绝使用wait async的新承诺

等待后,当承诺返回时,我希望获取数据并将其分配给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?
如果我把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函数中使用这里返回的值。无论哪种方式,如果我需要使用该值,它都需要在异步函数中正确吗?