Promise对象-异步操作
一个Promise对象代表一个目前还不可用,但是在未来的某个时间点可以被解析的值。它允许你以一种同步的方式编写异步代码。
简单用法(原生)
if(window.Promise){
console.log('Promise found');
var promise = new Promise(function(resolve,reject){
var request = new XMLHttpRequest();
request.open('GET','http://api.icndb.com/jokes/random');
request.onload = fucntion(){
if(request.status == 200){
resolve(request.response); //我们在此处获得了数据,因此解析Promise
}else{
reject(Error(request.statusText));//状态码不是200,因此调用reject
}
};
request.onerror = function(){
reject(Error('Error fetching data'));//错误发生,拒绝Promise
};
request.send(); //发送请求
});
console.log('Asynchronous request made.');
promise.then(function(data){
console.log('Got data! Promise fulfilled.');
document.getElementByTagName('body')[0].textContent = JSON.parse(data).value.joke;
},function(error){
console.log('Promise rejected');
console.log(error.message);
});
} else {
console.log('Promise not available');
}
#jQuery的deferred对象详解
$.Deferred的实现
创建三个$.Callbacks对象,分别表示成功,失败,处理中三种状态 创建了一个promise对象,具有state、always、then、primise方法 通过扩展primise对象生成最终的Deferred对象,返回该对象
$.when的实现
接受若干个对象,参数仅一个且非Deferred对象将立即执行回调函数 Deferred对象和非Deferred对象混杂时,对于非Deferred对象remaining减1 Deferred对象总数 = 内部构建的Deferred对象 + 所传参数中包含的Deferred对象 所传参数中所有Deferred对象每当resolve时remaining减1,直到为0时(所有都resolve)执行回调
##简单实用
//请求url
function geturl(url,datas){
return $.ajax({
type : 'GET',
dataType : "jsonp",
jsonp:"callback",
data: datas || "",
url : url,
async : false,
cache : false
});
}
//发起,回调函数可以添加任意多个,它们按照添加顺序执行。
geturl("http://task.game.duowan.com/act/commonConf.do",{"actId":32321}).done(function(data){
console.log("哈哈,成功了!");
}).fail(function(e){
console.log("出错啦!");
}).done(function(){
console.log("第二个回调函数!");
})
##为多个操作指定回调函数
$.when(geturl("commonConf.do"), geturl("getCode.do")).done(function(data,data2){
console.log(data);
console.log(data2);
})
##deferred.promise()方法 var wait = function(){ var dtd = $.Deferred(); //在函数内部,新建一个Deferred对象 var tasks = function(){ alert(“执行完毕!”); dtd.resolve(); // 改变Deferred对象的执行状态 }; dtd.notify(); setTimeout(tasks,2000); return dtd.promise(); // 返回promise对象 };
$.when(wait())
.done(function(){ alert("哈哈,成功了!"); })
.fail(function(){ alert("出错啦!"); })
.progress(function(){ console.log("等待中....") })
.always(function(){ console.log("总是执行") });