前言:
我們知道,JavaScript語言的執行環境是單線程的。
function f1(){
setTimeout(function () {
//doSomething
setTimeout(function () {
//doSomething
setTimeout(function () {
//doSomething
},300)
},200)
},100)
}
這樣書寫固然簡單,但是問題也來了,金字塔類型的接口不利於代碼閱讀與維護,如果,代碼寫成這樣,會不會更利於閱讀維護呢?f1
.then(function () {
})
.then(function () {
})
.then(function () {
});
即將原來的回調金字塔式改寫成鏈式,這樣我們就可以很清楚的看清楚每個方法執行的是什麼了。Jquery中的promise
var jqxhr = $.ajax( "example.php" )
.done(function() {
alert( "success" );
})
.fail(function() {
alert( "error" );
})
.always(function() {
alert( "complete" );
});
function wait(resolve){
var a=1;
resolve(a);
}
wait(function (data) {
alert(data)
});
改寫成 function wait() {
var def = $.Deferred(); //獲取deferred對象
def.resolve(1); // 改變Deferred對象的執行狀態 ,resolve爲成功狀態 //當收到resolve時,變執行then方法
setTimeout(tasks, 1000);
return def.promise();
}
$.when(wait())
.then(function (data) {
alert(data); //1 該值有resolve(1) 中的1得來
})
$.when(wait())
.then(function (data) {
alert(data);
return data+1;
})
.then(function (data) {
alert(data);
});
angular中的promise
<span style="white-space:pre"> </span>var getData = function () {
var defer = $q.defer(); //同jquery $.Deferred
$timeout(function () {
defer.resolve(1); //改變成功狀態
}, 1000);
return defer.promise;
};
getData()
.then(function (data) { //getData執行完成後
alert(data); //1
return data+1;
})
.then(function (data) {
alert(data); //2
});
注意,angular還有一個when方法,他和jquery中的$.when()還是有一些區別的,如下<span style="font-family:Microsoft YaHei;">var def = $q.defer();
var q=$q.when(12);
q.then(function (data) {
alert(data); //12
});</span>
angular 中$q.when()方法是將裏面的參數封裝成一個$q.defer().promise對象,因此 可以通過then方法獲取when裏面的值