promise 链式调用中,then的第一个(参数)函数中为什么需要手动 return 一个 promise,而不是自动?

发布于 2022-09-12 04:17:34 字数 2124 浏览 21 评论 0

  • 疑问0:then的第一个(参数)函数中 只有return promise才是最佳实践吗?
  • 疑问1(基于疑问0):是最佳实践的话,设计之初,为什么不将返回值 自动转为promise,而无需考虑程序员 有无return?
  • 疑问2(基于疑问0):不是最佳实践的话,那么不写return 或 return一个非promise值 有什么实际意义? 另外这种情况能否用return一个promise来代替掉(即代码运行结果不变)。

摘自 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

// Bad example! Spot 3 mistakes!

doSomething().then(function(result) {
  doSomethingElse(result) // Forgot to return promise from inner chain + unnecessary nesting
  .then(newResult => doThirdThing(newResult));
}).then(() => doFourthThing());
// Forgot to terminate chain with a catch!

The first mistake is to not chain things together properly. This happens when we create a new promise but forget to return it. As a consequence, the chain is broken, or rather, we have two independent chains racing. This means doFourthThing() won't wait for   doSomethingElse() or doThirdThing() to finish, and will run in parallel with them, likely unintended. Separate chains also have separate error handling, leading to uncaught errors.

The second mistake is to nest unnecessarily, enabling the first mistake. Nesting also limits the scope of inner error handlers, which—if unintended—can lead to uncaught errors. A variant of this is the promise constructor anti-pattern, which combines nesting with redundant use of the promise constructor to wrap code that already uses promises.

The third mistake is forgetting to terminate chains with catch. Unterminated promise chains lead to uncaught promise rejections in most browsers.

doSomething()
.then(function(result) {
  return doSomethingElse(result);
})
.then(newResult => doThirdThing(newResult))
.then(() => doFourthThing())
.catch(error => console.error(error));

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

戏蝶舞 2022-09-19 04:17:34

Promise then 返回值 根据then内函数的返回值,then的返回值有不同策略呀

doesn't return anything, the promise returned by then gets resolved with an undefined value.

returns an already fulfilled promise, the promise returned by then gets fulfilled with that promise's value as its value.

我认为 then函数内是否return 取决于业务

test1().then(() => 
    test2()
).then(() => 
    test3()
).then(() => 
    test4()
)

这个是test1-4顺序执行,且如果前面reject时,后面就会不执行,前后有一个明显的依赖关系。

test1().then(() => { 
    test2() 
}).then(() => {
    test3()
}).then(() => {
    test4()
})

这个同样时test1-4顺序执行,但是如果前面reject,不影响后续执行,这里只关注执行的顺序问题,不关注前者动作是否成功。

黒涩兲箜 2022-09-19 04:17:34

我先排个行号。

1. // Bad example! Spot 3 mistakes!
2. 
3. doSomething().then(function(result) {
4.   doSomethingElse(result) // Forgot to return promise from inner chain + unnecessary nesting
     .then(newResult => doThirdThing(newResult));
5. }).then(() => doFourthThing());
6. // Forgot to terminate chain with a catch!

在该文档选文中,根据命名的语义,以及原文档前面的部分,开发者在这一段代码中的意图应该是 doSomething 运行结束后,再运行 doSomethingElse,同理同步依次执行完 doSomethingElsedoThirdThing(),都结束后执行 doFourthThing,而且这四个函数应该都是异步函数,返回的都是 Promise。但是因为第 4 行前没有 return,导致第 5 行的 then 并没有挂在第 4 行的 Promise 上,而是挂在了一个 Promise.resolve(undefined) 上,立即执行,导致 doFourthThing 立即执行,和 doThirdThing 成了异步关系。

所以该文档在这里的意思,应该是若你想要 Promises 同步执行,就 return Promise,不然就整成了异步。

若本来就想异步,纵向排开就完事了。文档没有指明 return Promise 是不是所有情况下的最佳实践。我个人也认为 then 函数内是否 return 取决于业务。

冬天旳寂寞 2022-09-19 04:17:34

没return就返回了一个undefined啊 逻辑是你的逻辑 语言层面又不知道你到底想返回啥

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文