近期在看模块化开发,然后涉及到了promise这种异步开发模式,于是总结一下,有不足之处,欢迎指正。
首先说一下,什么是promise,为什么会有promise的出现。
1、所谓 Promise,就是一个对象,用来传递异步操作的消息。它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的 API,可供进一步处理。
在我讲来,promise模式是一个异步编程模式,promise本身就是一个构造函数,实例化时接收一个函数作为参数,这个参数函数又有两个参数,即resolve和reject。
2、promise的出现,可以带来的好处:
- 便于阅读
- 用同步模式,编写异步代码,调试时简单、方便
- 避免回调嵌套,即避免回调地狱
ES6 promise
先定义一个testService文件:
function test() {
var promise = new Promise(function (resolve, reject){
if (成功) {
resolve(data);
}else{
reject(err);
}
})
return promise;
}
然后调用时:
testService.test().then(function(){
// 成功则执行该函数
},function(){
// 失败则执行该函数
})
jquery Deffered 对象
在jquery里,ajax函数操作在1.5版本之后都已经重新封装支持了Deffered对象,
1.5版本之前: ajax()返回的是XHR对象
1.5版本之后: ajax()返回的是Deffered对象
ajax操作:
$.ajax({url, type..})
.done(// 成功回调)
.fail(// 失败回调)
非ajax操作:
先定义一个testService文件:
function test(){
var def = $.Deffered();
if(成功) {
def.relsolve();
}else{
def.reject();
}
return def;
}
调用时:
testService.test().then(function(){
// 成功时执行
},function(){
// 失败时执行
})
angular $q
在angular中也支持promise,需要通过$q这个内置服务,用法如下
同样先定义一个testService文件:
function test(){
var def = $q.deffer();
$http.get({type, url})
.then(function(){
def.resolve(data)
}, function(){
def.reject(err)
})
return def.promise;
}
调用时:
testService.test().then(function(){
// 成功时执行
},function(){
// 失败时执行
})