Javascript-处理异步竞争条件
N.B.作为副本删除之前: 我意识到类似的问题以前已经被问过很多次了,但是我花了几个小时试图用其他人的回答来实现这一点,最近的一次是noseratio在这条线索中的回答,但没有成功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
我有一个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);
}
如果您还没有,请查看指南,其中对它们的解释相当透彻。当您了解承诺的工作原理时,也会变得更容易理解。Tripleawait
如果在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
不冗余的唯一位置。(多余的是数据上的第二个等待
)