【发布时间】:2021-02-10 06:36:18
【问题描述】:
当使用对await 的赋值Promise 与仅使用await 而不使用赋值时会发生什么?取下面的代码:
const getSomething = async () => {
let todos = null;
await fetch('http://jsonplaceholder.typicode.com/todos/1')
.then((response) => response.json())
.then(
(data) => {
todos = data
}
);
return todos;
};
const getSomethingElse = async () => {
let todos = null;
await fetch('http://jsonplaceholder.typicode.com/todos/2')
.then((response) => response.json())
.then(
(data) => {
todos = data
}
);
return todos;
};
const doSomething = async () => {
const somethingPromise = getSomething();
const somethingElsePromise = getSomethingElse();
const something = await somethingPromise;
const somethingElse = await somethingElsePromise;
console.log(something);
console.log(somethingElse);
}
doSomething();
输出是
{ userId: 1, id: 1, title: 'delectus aut autem', completed: false }
{
userId: 1,
id: 2,
title: 'quis ut nam facilis et officia qui',
completed: false
}
但是,如果我们将 doSomething() 函数更改为简单的 await 两个 Promises,如下所示:
const doSomething = async () => {
const somethingPromise = getSomething();
const somethingElsePromise = getSomethingElse();
await somethingPromise;
await somethingElsePromise;
console.log(somethingPromise);
console.log(somethingElsePromise);
}
我们得到输出:
Promise {
{ userId: 1, id: 1, title: 'delectus aut autem', completed: false }
}
Promise {
{
userId: 1,
id: 2,
title: 'quis ut nam facilis et officia qui',
completed: false
}
}
为什么我们看到这些包裹在 Promises 中?
如果我们要简单地这样做,就可以把重点放在家里:
const somethingPromise = getSomething();
const somethingElsePromise = getSomethingElse();
console.log(await somethingPromise);
console.log(await somethingElsePromise);
我们会得到以下的原始输出:
{ userId: 1, id: 1, title: 'delectus aut autem', completed: false }
{
userId: 1,
id: 2,
title: 'quis ut nam facilis et officia qui',
completed: false
}
从中可以看出没有包装Promises
总而言之,我想了解“awaited”Promise 在分配给变量或通过函数(例如console.log)传递时会发生什么,而不是仅仅是 'awaited' 没有赋值或参数传递。
编辑 下面我展示了
doSomething()的三个版本和不同的输出。
第一个版本:
const doSomething = async () => {
const somethingPromise = getSomething();
const somethingElsePromise = getSomethingElse();
const something = await somethingPromise;
const somethingElse = await somethingElsePromise;
console.log(something);
console.log(somethingElse);
}
输出
{ userId: 1, id: 1, title: 'delectus aut autem', completed: false }
{
userId: 1,
id: 2,
title: 'quis ut nam facilis et officia qui',
completed: false
}
第二版:
const doSomething = async () => {
const somethingPromise = getSomething();
const somethingElsePromise = getSomethingElse();
console.log(somethingPromise);
console.log(somethingElsePromise);
}
输出
Promise { <pending> }
Promise { <pending> }
第三版:
const doSomething = async () => {
const somethingPromise = getSomething();
const somethingElsePromise = getSomethingElse();
await somethingPromise;
await somethingElsePromise;
console.log(somethingPromise);
console.log(somethingElsePromise);
}
输出:
Promise {
{ userId: 1, id: 1, title: 'delectus aut autem', completed: false }
}
Promise {
{
userId: 1,
id: 2,
title: 'quis ut nam facilis et officia qui',
completed: false
}
}
【问题讨论】:
-
“为什么我们会看到这些包装在 Promise 中?”因为你从不unwrap它们。承诺就是承诺,并且永远如此。您可以通过
await-ing 承诺 来获取价值,结果 就是价值。另一种方法是使用.then()/.finally()的 promise API。 -
非常类似于我昨天提供的问题/答案here。
async函数总是返回一个 Promise,而从该 Promise 中获取值的唯一方法是让调用者在async函数返回的 Promise 上使用.then()或await。来自async函数的return值只是成为async函数已经返回的承诺的解析值。前面提到的答案中有更多解释。 -
谢谢@VLAZ,但我的问题是关于理解函数 doSomething() 的两个版本之间的区别,这与我们仅等待 Promise 与将它们分配或传递到功能类似于 console.log()。
-
谢谢@jfriend00,但我真的只是想了解简单地说“await VariableName”与“const x = await VariableName”之间的区别
-
@MichaelCameron 你有一张披萨的收据——这是你的承诺。它会到,你会有比萨饼,但你现在没有。然后,您将
await与await receipt发送比萨饼。您现在查看收据 - 它仍然是收据,而不是比萨饼。这就是 Promise 的工作原理。
标签: javascript node.js asynchronous async-await