为啥我们需要返回一个 promise resolve?

Posted

技术标签:

【中文标题】为啥我们需要返回一个 promise resolve?【英文标题】:Why do we need to return a promise resolve?为什么我们需要返回一个 promise resolve? 【发布时间】:2021-08-23 22:25:22 【问题描述】:

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 方法本质上不是这样做的,即返回一个值吗?

【问题讨论】:

.then(result => return Promise.resolve(result); ) 毫无意义,只需将其删除。但是,是的,如果您不返回来自 then 的承诺,那么您将无法链接更多的 .then 调用 这根本没有意义。 .then((result) => Promise.resolve(result)).then((result) => result) 相同,这与根本没有 .then 相同。 相关:What's the difference between returning value or Promise.resolve from then(). 是的,我知道这部分根本不需要添加。但我添加它是为了理解 Promises,在我看来,原则上它应该可以工作。你能帮我理解我在倒数第二行写'return'和不写有什么区别吗? 您根本不需要Promise.resolve(result)。您只需要一个返回值,例如return result。如果 .then() 没有返回值,则 promise 的解析值变为 undefined 【参考方案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));

【讨论】:

【参考方案2】:

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

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

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

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

在你说过的评论中:

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

这是因为我在上面第一段中提到的原因:否则,函数返回undefined(隐式)。下面是ab 的区别。您可能会想到 简洁 箭头语法,其中函数的主体只是一个表达式,而 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。没有理由创造另一个承诺;履行处理程序的返回值将用于解析返回的承诺then。不需要额外的。

【讨论】:

【参考方案3】:

首先可以去掉整个中间then

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

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

最后,

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

等同于:

.then((result) => result)

【讨论】:

以上是关于为啥我们需要返回一个 promise resolve?的主要内容,如果未能解决你的问题,请参考以下文章

当异步函数不应该返回 Promise 时,为啥我需要等待它?

为啥链接到 Promise.resolve() 的 .then() 允许重新分配 const 声明?

return Promise.resolve

对Promise中的resolve,reject,catch的理解

Javascript Promise 多次返回.

Javascript Promise 多次返回.