我們先來看下面一個例子:
var getPromise = $.get('/query');
getPromise.done(function(data) {var postPromise = $.post('/search', data);
});
// ...無法在此處給postPromise方法附加處理器// 上面先使用get方法讀取url為query的數據,在完成后,再使用post方法將數據發送給另一個url(/search);
// 問題在于,如果我們想給postPromise附加一個處理器,,,,
// emmm會發現,在get方法獲取數據之前,我們是無法在最外層給postPromise添加處理器的..
解決方法:
// 幸運的是jQuery1.6版本以上新增了pipe方法,可以讓我們(邏輯上)提前的使用get的數據,如下
var getPromise = $.gert('/query');
var postPromise = getPromise.pipe(function (data){return $.post('/search', data);
});// 注:自處的data就是get方法請求的返回的數據,現在在邏輯上提前的使用它..
妙用:
// 管道(pipe)級聯技術..
// 使用pipe可以不費吹灰之力地定義異步的分化邏輯.如下例:
var step1 = $.post('/step1', data1);
var step2 = step1.pipe(function() {return $.post('step2', data2);
});
var step3 = step2.pipe(function() {return $.post('/step3', data3);
});// 上述代碼,如果step1,執行失敗,那么step2 和 step3都將拒絕執行,
// 如果step2執行失敗,step3將拒絕執行
// 就像一條管道一樣,將異步操作,從step1到step3依次執行// 另外一種寫法(只在乎整體進程)
var posting = $.post('/step1', data1).pipe(function(){return $.post('/step2', data2);}).pipe(function() {return $.post('/step3', data3);});
參考《JavaScript異步編程》— 設計快速響應的網絡應用 P59~P62