window.Promise 已经是 JS 的一个内置对象了。
1. Promise 有规格文档吗?
2. 你一般如何使用 Promise。
-----------
目前的 Promise 都遵循 Promises/A+ 规范。
英文规范:https://promisesaplus.com/
中文翻译:图灵社区 : 阅读 : 【翻译】Promises/A+规范
看完规范你可以了解 Promise 的全貌,本文主要讲讲 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 来了
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)