不同位置的await会产生不同的结果。

3

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

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

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

我做错了什么?


你想要并行处理,我认为仅使用 async-await 是无法实现的。 - md2perpe
“//do stuff here”和“//...other calculations here...”是什么?它们实际上是异步的吗? - Bergi
const data = await calculateStuff(obj); 中,data 是结果对象(Promise 的完成值)。在 const data = calculateStuff(obj); 中,data 是一个 Promise 对象,它没有 ["a"]/["b"]/["c"] 属性。 - Bergi
1个回答

2

异步函数会返回一个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();


这段代码真的会与其他代码并行运行 test() 吗? - md2perpe
@md2perpe - 我并不真的期望它是并行的(我认为它不是并行的,甚至不是另一个线程)。我的计算中很多延迟都是由于需要调用一些API。我只是不想让其他计算因等待响应而变得缓慢。当我的计算在等待响应时,我希望能做其他有用的工作。所以我希望隐藏网络延迟,但不希望隐藏计算延迟。 - user1784747

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接