Skip to content

Instantly share code, notes, and snippets.

@303182519
Created July 19, 2014 03:35
Show Gist options
  • Save 303182519/7f6b7cc46f35b0613302 to your computer and use it in GitHub Desktop.
Save 303182519/7f6b7cc46f35b0613302 to your computer and use it in GitHub Desktop.
JavaScript Promises

一个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("总是执行") });
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment