我有这段代码:
Event = new Event();
// Create a deferred object
var dfd = $.Deferred();
// Add handlers to be called when dfd is resolved
dfd.done( Event.getEvents( position.coords.latitude, position.coords.longitude ) ).then( function( data ){
//rest of the code ..
console.log("No!");
});
这不符合我的要求。完成永远不会解决,then()
永远不会被触发。这是Event.getEvents
(在另一个文件中):
function Event() {
this.getEvents = function( lat, lng )
{
var d = new $.Deferred();
console.log("events");
var key = getCookie("key");
$.ajax({
type:"GET",
url: server_url + 'event/eventssurrounding',
headers: { 'X-API-KEY': key },
data: { lat:lat, lng: lng, radius: radius, limit: limit, offset: offset },
dataType: 'json',
success : function(results) {
console.log('success');
d.resolve = results.map( function ( event ) {
console.log(event);
var dist = JSON.stringify(event.distance);
console.log(dist);
return {
id: event.id,
name: event.name,
type: event.type,
desc: event.desc,
short_desc: event.desc.substring(0,200),
pic: event_pic_url + event.picture,
place: {
id: event.placeId,
name: event.placeName,
type: event.placeType
},
dist: dist.substring(0,3),
lat: event.latitude,
long: event.longitude,
}
});
console.log("done");
return d.promise();
},
error : function( xhr, type )
{
return null;
}
});
console.log("This shouldn't be logged before success.");
}
};
我希望在AJAX调用之后触发console.log("No!")
(在第一篇博客中)。但是从我在控制台日志中看到的情况来看,ajax调用是在“不应该在成功之前记录”之后执行的。已记录。并且永远不会触发完成。我找不到原因。
这是我的日志:
events
This shouldn't be logged before success.
success
Object
2.3322972250333
done
如果我尝试使用$.when(Event.getEvents()
...则在“成功之前不应记录此内容后立即触发完成。”
当我返回一个承诺时,如何在AJAX调用结束后触发延迟对象?
由于
答案 0 :(得分:2)
您的代码非常奇怪:您尝试将getEvents
函数的结果传递给$.when
(它应该接受jQuery延迟对象),但getEvents
根本没有返回语句
$.when
获取undefined
并且实际上无关。我想你的getEvents
函数可能会返回ajax调用的结果:
this.getEvents = function( lat, lng )
{
// ... code
return $.ajax({
// ....
});
}
我认为这可能只是解决方案的一部分,但我相信这是一个良好的开端。
接下来,你为什么这么想:
console.log("This shouldn't be logged before success.");
成功之前不能执行?您启动了异步调用,下一个语句为console.log
。 JS是单线程的,在此log
调用之前,ajax调用不可能完成工作。这没有任何意义。
接下来,以下代码是什么?
d.resolve = ....
是不是应该
d.resolve ( // ... );