promise 链式调用中,then的第一个(参数)函数中为什么需要手动 return 一个 promise,而不是自动?
- 疑问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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Promise then 返回值 根据then内函数的返回值,then的返回值有不同策略呀
我认为 then函数内是否return 取决于业务
这个是test1-4顺序执行,且如果前面reject时,后面就会不执行,前后有一个明显的依赖关系。
这个同样时test1-4顺序执行,但是如果前面reject,不影响后续执行,这里只关注执行的顺序问题,不关注前者动作是否成功。
我先排个行号。
在该文档选文中,根据命名的语义,以及原文档前面的部分,开发者在这一段代码中的意图应该是
doSomething
运行结束后,再运行doSomethingElse
,同理同步依次执行完doSomethingElse
、doThirdThing()
,都结束后执行doFourthThing
,而且这四个函数应该都是异步函数,返回的都是Promise
。但是因为第 4 行前没有return
,导致第 5 行的then
并没有挂在第 4 行的Promise
上,而是挂在了一个Promise.resolve(undefined)
上,立即执行,导致doFourthThing
立即执行,和doThirdThing
成了异步关系。所以该文档在这里的意思,应该是若你想要
Promises
同步执行,就return Promise
,不然就整成了异步。若本来就想异步,纵向排开就完事了。文档没有指明
return Promise
是不是所有情况下的最佳实践。我个人也认为then
函数内是否return
取决于业务。没return就返回了一个undefined啊 逻辑是你的逻辑 语言层面又不知道你到底想返回啥