Javascript-处理异步竞争条件

Javascript-处理异步竞争条件,javascript,async-await,es6-promise,Javascript,Async Await,Es6 Promise,N.B.作为副本删除之前: 我意识到类似的问题以前已经被问过很多次了,但是我花了几个小时试图用其他人的回答来实现这一点,最近的一次是noseratio在这条线索中的回答,但没有成功 我有一个nodeJS服务器,当我的函数f1请求数据时,它会成功地返回数据,还有一个函数f2调用f1,然后打算对这个异步函数的输出做一些事情。我正在尝试使用async/await语法和f2中的附加承诺来实现这一点,如下所示 async function f1(){ try{ let respons

N.B.作为副本删除之前: 我意识到类似的问题以前已经被问过很多次了,但是我花了几个小时试图用其他人的回答来实现这一点,最近的一次是noseratio在这条线索中的回答,但没有成功


我有一个nodeJS服务器,当我的函数f1请求数据时,它会成功地返回数据,还有一个函数f2调用f1,然后打算对这个异步函数的输出做一些事情。我正在尝试使用async/await语法和f2中的附加承诺来实现这一点,如下所示

async function f1(){
   try{
       let response = await fetch('MY SERVER URL');
       let data = await response.json();
       return await data;
   }
   catch(e) {
       alert(e);
   }
};


function f2() {
    var promise = f1();
    promise.then(function(result) {
        JSONdata = promise.markers;
        console.log("JSON read into f2");
    })    

    console.log(JSONdata);
然后f2继续做其他事情

然而问题是,我正在经历比赛条件,f1的结果没有及时返回,因此变量没有定义


任何关于如何缓解这种情况的帮助都将不胜感激,谢谢。

坚持这种模式

async func1() { 
  console.log('this is async function')
  return JSON.parse(await fetch(options))
}

func2 () { 
   console.log('this is not async function')
 }

        if(await func1()){
            func2()
        }
函数1中有太多的等待。只等待承诺的回报。
在这个层次上,您不应该混淆“.then”和“await”语法。试着坚持一种模式,然后探索另一种模式。然后混合。

坚持这个模式

async func1() { 
  console.log('this is async function')
  return JSON.parse(await fetch(options))
}

func2 () { 
   console.log('this is not async function')
 }

        if(await func1()){
            func2()
        }
函数1中有太多的等待。只等待承诺的回报。
在这个层次上,您不应该混淆“.then”和“await”语法。试着坚持一种模式,然后探索另一种模式。然后将其混合。

类似的方法应该可以:

异步函数f1(){ 试一试{ const response=wait fetch('我的服务器URL') return wait response.json() }捕获(e){ 控制台错误(e) } } 异步函数f2(){ 常量{markers}=await f1() log(`Result provided to'f2':${markers}`) } 在您的代码中,
返回等待数据
中的
等待
是多余的,因为
数据
不是承诺;而且,
f2
似乎不完整


请注意,尽管通常情况下,
return await…
async
函数中是不必要的(并且被认为是不好的形式,即使它是无害的),但如果您希望周围有一个try…catch来捕获承诺拒绝,那么
return await…
是必要的。请参阅。

类似的操作应该可以:

异步函数f1(){ 试一试{ const response=wait fetch('我的服务器URL') return wait response.json() }捕获(e){ 控制台错误(e) } } 异步函数f2(){ 常量{markers}=await f1() log(`Result provided to'f2':${markers}`) } 在您的代码中,
返回等待数据
中的
等待
是多余的,因为
数据
不是承诺;而且,
f2
似乎不完整


请注意,尽管通常情况下,
return await…
async
函数中是不必要的(并且被认为是不好的形式,即使它是无害的),但如果您希望周围有一个try…catch来捕获承诺拒绝,那么
return await…
是必要的。请参阅。

您应该将使用
f1
结果的逻辑移动到
然后
回调中

function f2() {
    var promise = f1();
    promise.then(function(result) {
        var JSONdata = result.markers;
        console.log("JSON read into f2");

        console.log(JSONdata);
    });
}
或者将
f2
更改为,以便您可以输入返回值

async function f2() {
    var result = await f1();
    var JSONdata = result.markers;
    console.log("JSON read into f2");

    console.log(JSONdata);
}

如果您还没有,请查看指南,其中对它们的解释相当透彻。当您了解承诺的工作原理时,也会变得更容易理解。

您应该将使用
f1
结果的逻辑移到
中,然后再移到
回调中

function f2() {
    var promise = f1();
    promise.then(function(result) {
        var JSONdata = result.markers;
        console.log("JSON read into f2");

        console.log(JSONdata);
    });
}
或者将
f2
更改为,以便您可以输入返回值

async function f2() {
    var result = await f1();
    var JSONdata = result.markers;
    console.log("JSON read into f2");

    console.log(JSONdata);
}

如果您还没有,请查看指南,其中对它们的解释相当透彻。当您了解承诺的工作原理时,也会变得更容易理解。

Triple
await
如果在
f1
中出错,您不需要最后一个
await
。此外,这不是竞争条件,所有依赖于正在解决的承诺的内容都应该放在
then
语句中,或者您可以使用另一个
async
函数。@Aplet123我基本上同意,但是最后一个
wait
不应该出错。不需要它,但等待非承诺本身返回值
n=wait 1
只会将
1
分配给
n
。哈,这很奇怪。我只是习惯于不等待非承诺。嗯,
console.log(JSONdata)应该在然后…请张贴“然后f2继续做其他事情…”的确切代码。一般来说,无法避免将这些内容放入
然后
回调或
等待
之后,并让
f2
返回承诺。这就是f1异步的含义。三重
await
应该在
f1
中出错,您不应该需要最后一个
await
。此外,这不是竞争条件,所有依赖于正在解决的承诺的内容都应该放在
then
语句中,或者您可以使用另一个
async
函数。@Aplet123我基本上同意,但是最后一个
wait
不应该出错。不需要它,但等待非承诺本身返回值
n=wait 1
只会将
1
分配给
n
。哈,这很奇怪。我只是习惯于不等待非承诺。嗯,
console.log(JSONdata)应该在然后…请张贴“然后f2继续做其他事情…”的确切代码。一般来说,无法避免将这些内容放入
然后
回调或
等待
之后,并让
f2
返回承诺。这就是f1异步的含义。实际上,
try
块是
wait
不冗余的唯一位置。(多余的是
数据上的第二个
等待