在不同的位置等待,产生不同的结果



我试图隐藏一些进行计算的代码的延迟。

以下示例。在下面的第一种情况中,我得到了预期的答案:

async function calculateStuff(thing) {
//do stuff here
return {"a": a, "b": b, "c": c};
}
const data = await calculateStuff(obj); //takes a while
const first = data["a"] //valid data
const second = data["b"] //valid data
const third = data["c"] //valid data

我想通过执行以下任一操作来隐藏calculateStuff的延迟,但这两种方法都使我的变量变得未定义:

async function calculateStuff(thing) {
//do stuff here
return {"a": a, "b": b, "c": c};
}
data = calculateStuff(obj); //takes a while
//...other calculations here...
await data;
const first = data["a"] //undefined
const second = data["b"] //undefined
const third = data["c"] //undefined

同样:

async function calculateStuff(thing) {
//do stuff here
return {"a": a, "b": b, "c": c};
}
data = calculateStuff(obj); //takes a while
//...other calculations here...
const first = await data["a"] //undefined
const second = await data["b"] //undefined
const third = await data["c"] //undefined

我做错了什么?

异步函数将返回Promise。调用await myAsyncFunction(),将在Promise实现后返回Promise的值。注意前面语句中的return它不会改变指针的位置

例如,调用await data不会更改data

您可以通过调用data = await data来获得所需的输出。

async function test()
{
return {a: 1, b: 2};
}
async function run()
{
let data = test();
data = await data;
console.log("A", data.a);
}
run();

您也可以使用.then()

async function test()
{
return {a: 1, b: 2};
}
async function run()
{
let data = test();
data.then((out) => {
console.log("A", out.a);
});
}
run();

最新更新