这是人们在开始使用 Promises 时被绊倒的一个常见问题,包括我自己。不过,首先...
很高兴您尝试使用新的Fetch API,但如果我是您,我现在会使用 XMLHttpRequest 实现,例如 jQuery AJAX 或 Backbone 的 jQuery 的覆盖实现.ajax()
,如果您已经在使用这些库。原因是 Fetch API 仍然很新,因此在这个阶段是实验性的。
话虽如此,人们肯定会使用它,但我不会在我自己的生产代码中使用它,直到它脱离“实验”状态。
如果您决定继续使用fetch
,则可以使用polyfill。注意:您必须跳过额外的环节才能使错误处理正常工作,并从服务器接收 cookie。如果您已经在加载 jQuery 或使用 Backbone,那么现在就坚持使用它们;无论如何,并不完全可怕。
现在进入代码:
你想要一个扁平的结构,否则你就错过了 Promises 的重点。嵌套 Promise 是不明智的,因为 Promise 解决了嵌套异步回调(回调地狱)无法解决的问题。
只需使用更具可读性的代码结构,您就可以节省自己的时间和精力,并减少错误代码的产生。这不是全部,但它是游戏的一部分,可以这么说。
Promises 是关于让异步代码保留同步代码丢失的大部分属性,例如平面缩进和一个异常通道。
-- Petka Antonov(蓝鸟Promise图书馆)
// run async #1
asyncGetFn()
// first 'then' - execute more async code as an arg, or just accept results
// and do some other ops
.then(response => {
// ...operate on response data...or pass data onto next promise, if needed
})
// run async #2
.then(asyncGetAnotherFn)
.then(response => {
// ...operate on response data...or pass data onto next promise, if needed
})
// flat promise chain, followed by 'catch'
// this is sexy error handling for every 'then' above
.catch(err => {
console.error('Request failed', err)
// ...raise exeption...
// ... or, retry promise...
})