我剛開始用承諾包頭,我可以使用一些指導來了解如何使此場景生效。下面的代碼來自一個更大的插件文件,但我已經包含了我認爲相關的部分。
有一個回調函數(callbackBeforeSend),我將執行一些異步地理位置的東西(我得到了這個工作),我需要保持ajax調用,直到這些函數完成。
我在代碼中看到他們使用$ .Deferred()來處理ajax響應,我想知道是否有辦法將回調函數和初始ajax調用綁定到$ .Deferred()中處理所有事情的正確執行順序。
所以我想發生什麼
- 回調函數的火災
- 異步的事情發生在回調並返回緯度,經度,地址
- 阿賈克斯火的緯度,經度,地址被返回從回調
任何幫助將不勝感激。我仍然不太瞭解諾言,但我正在努力學習。謝謝!
$.extend(Plugin.prototype, {
_getData: function (lat, lng, address) {
var _this = this;
var d = $.Deferred();
if (this.settings.callbackBeforeSend) {
this.settings.callbackBeforeSend.call(this, lat, lng, address);
}
$.ajax({
type : 'GET',
url : this.settings.dataLocation + (this.settings.dataType === 'jsonp' ? (this.settings.dataLocation.match(/\?/) ? '&' : '?') + 'callback=?' : ''),
// Passing the lat, lng, and address with the AJAX request so they can optionally be used by back-end languages
data: {
'origLat' : lat,
'origLng' : lng,
'origAddress': address
},
dataType : dataTypeRead,
jsonpCallback: (this.settings.dataType === 'jsonp' ? this.settings.callbackJsonp : null)
}).done(function (p) {
d.resolve(p);
// Loading remove
if(_this.settings.loading === true){
$('.' + _this.settings.formContainer + ' .' + _this.settings.loadingContainer).remove();
}
}).fail(d.reject);
return d.promise();
}
});
不改變這個代碼,你不能這樣做。我不清楚你是否編寫了這個代碼,或者它是否是一個無法更改的第三方庫。 –
我沒有寫這段代碼,它是從插件文件中提取的。不過,我可以更改代碼。我相信我需要將回調調用和ajax調用綁定到$ .Deferred函數中。 – yoxalld
大部分你看起來沒問題,你只需要你的'callbackBeforeSend'來返回一個promise,並在'callbackBeforeSend.then(...)'' – dave