【发布时间】:2020-07-12 11:10:53
【问题描述】:
注意在删除之前: 我意识到类似的问题已经被问过很多次了,但是我花了几个小时尝试使用其他人的回复来实现这个,最近是来自 noseratio 在这个线程Proper way to wait for one function to finish before continuing? 中的回复并且没有成功。
我有一个 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 没有及时返回,无法对其进行任何操作,因此变量未定义。
任何关于如何减轻这种情况的帮助将不胜感激,谢谢。
【问题讨论】:
-
三重
await应该在f1中出错,你不应该需要最后一个await。这也不是竞争条件,所有依赖于被解决的承诺的东西都应该放在then语句中,或者你可以使用另一个async函数。 -
@Aplet123 我基本同意,但是最后一个
await不应该出错。它不是必需的,但等待非承诺返回值本身。n = await 1将简单地将1分配给n。 -
嗯,这很奇怪。我一直养成了不等待非承诺的习惯。
-
嗯,
console.log(JSONdata);应该在 then...... -
请发布“然后 f2 继续做其他事情...”的确切代码。一般来说,没有办法避免将这些东西放在
then回调中或await之后,并让f2也返回一个承诺。这就是 f1 是异步的意思。
标签: javascript async-await es6-promise