为什么我们需要返回一个承诺解析?

时间:2021-06-06 16:33:29

标签: javascript node.js asynchronous async-await

async function f() {

  let promise = new Promise((resolve, reject) => {
    setTimeout(() => resolve("done!"), 1000)
  });

  let result = await promise; // wait until the promise resolves (*)

  return result; // "done!"
}
f().then(result => {
  return Promise.resolve(result);
}).then(r => console.log(r))

如果我从倒数第二行中删除 return 关键字,则上述代码无法按预期工作。我不明白为什么我们需要写一个return? Promise 的 resolve 方法本质上不是就是返回一个值吗?

3 个答案:

答案 0 :(得分:2)

<块引用>

我不明白为什么我们需要写回报?

因为如果不这样做,履行回调的返回值将是 undefined,与任何其他函数一样,这意味着由该 then 调用创建的承诺的履行值将是 { {1}} 而不是 undefined

完全没有理由使用那个履行处理程序,它没有做任何有用的事情,它只是在承诺履行中引入了一个额外的异步“滴答”。只需删除它:

result

在您的评论中:

<块引用>

我知道根本不需要添加该部件。但我添加它是为了理解 Promises 并且在我看来,原则上它应该可以工作。

这是我在上面第一段中提到的原因:否则,函数返回 f().then(result => console.log(result)) (隐式)。下面是 undefineda 的区别。您可能会想到 concise 箭头语法,其中函数体只是一个表达式,而 b 是隐式的,如下面的 return

c

在这种情况下,您将使用:

const a = () => {
    42;
};
const b = () => {
    return 42;
};
const c = () => 42; // No `{` just after the `=>`

console.log(a()); // undefined
console.log(b()); // 42
console.log(c()); // 42

请注意,那里没有 f().then(result => result) // If you want that there to understand it better .then(result => console.log(result)) 。没有理由创建另一个承诺;履行处理程序的返回值将用于解析返回的承诺 Promise.resolve。不需要额外的。

答案 1 :(得分:1)

首先,您可以删除整个中间的 then

f().then(r => console.log(r))

其次,最后一个 then 需要来自前一个的输入:r,这就是我们应该 return 它的原因。

最后,

.then((result) => Promise.resolve(result))

等同于:

.then((result) => result)

答案 2 :(得分:1)

注意这之间的细微差别:

f().then(result => {
  Promise.resolve(result);
}).then(r => console.log(r)); // prints "undefined"

与此相比:

f().then(result =>
  Promise.resolve(result)
).then(r => console.log(r)); // prints resolved value of `f`

在第一个示例中,您将多个语句(在括号内)提供给 then 处理程序。由于您没有明确返回值,因此返回值是未定义的,后续 then 处理程序将看到该值。

在第二个例子中,箭头函数提供了一个简单表达式(没有括号,只提供了一行)。在这种情况下,为函数提供返回值的是表达式本身。

这个 documentation on arrow function 语法更精确一些。

正如其他人指出的那样,在这个人为的例子中,根本不需要 Promise.resolve(),因为赋予 then 处理程序的值确实已经解决了。所以你也可以这样做:

f().then(r => console.log(r));