我刚开始用承诺包头,我可以使用一些指导来了解如何使此场景生效。下面的代码来自一个更大的插件文件,但我已经包含了我认为相关的部分。
有一个回调函数(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