window.Promise 已经是 JS 的一个内置对象了。
1. Promise 有规格文档吗?
2. 你一般如何使用 Promise。
-----------
目前的 Promise 都遵循 Promises/A+ 规范。
英文规范:https://promisesaplus.com/
中文翻译:图灵社区 : 阅读 : 【翻译】Promises/A+规范
看完规范你可以了解 Promise 的全貌,本文主要讲讲 Promise 的用途。
假设我们用 getUser 来说去用户数据,它接收两个回调 sucessCallback 和 errorCallback:
function getUser(successCallback, errorCallback){ $.ajax({ url:'/user', success: function(response){ successCallback(response) }, error: function(xhr){ errorCallback(xhr) } }) }
看起来还不算复杂。
如果我们获取用户数据之后还要获取分组数组、分组详情等,代码就会是这样:
getUser(function(response){ getGroup(response.id, function(group){ getDetails(groupd.id, function(details){ console.log(details) },function(){ alert('获取分组详情失败') }) }, function(){ alert('获取分组失败') }) }, function(){ alert('获取用户信息失败') })
三层回调,如果再多一点嵌套,就是「回调地狱」了。
Promise 的思路呢,就是 getUser 返回一个对象,你往这个对象上挂回调:
var promise = getUser() promise.then(successCallback, errorCallback)
当用户信息加载完毕,successCallback 和 errorCallback 之一就会被执行。
把上面两句话合并成一句就是这样的:
getUser().then(successCallback, errorCallback)
如果你想在用户信息获取结束后做更多事,可以继续 .then:
getUser().then(success1).then(success2).then(success3)
请求成功后,会依次执行 success1、success2 和 success3。
如果要获取分组信息:
getUser().then(function(response){ getGroup(response.id).then(function(group){ getDetails(group.id).then(function(){ },error3) },error2) }, error1)
这种 Promise 写法跟前面的回调看起来其实变化不大。
真的,Promise 并不能消灭回调地狱,但是它可以使回调变得可控。你对比下面两个写法就知道了。
getGroup(response.id, success2, error2) getGroup(response.id).then(success2, error2)
用 Promise 之前,你不能确定 success2 是第几个参数;
用 Promise 之后,所有的回调都是
.then(success, error)
这样的形式。
以上是 Promise 的简介,想完整了解 Promise,请参考下面的自学链接。
Promise对象 -- JavaScript 标准参考教程(alpha)
饥人谷一直致力于培养有灵魂的编程者,打造专业有爱的国内前端技术圈子。如造梦师一般帮助近千名不甘寂寞的追梦人把编程梦变为现实,他们以饥人谷为起点,足迹遍布包括facebook、阿里巴巴、百度、网易、京东、今日头条、大众美团、饿了么、ofo在内的国内外大小企业。 了解培训课程:加微信 xiedaimala03,官网:https://jirengu.com
本文作者:饥人谷方应杭老师