为什么我的deferred.done()等待AJAX​​调用未解决?

时间:2014-01-19 06:28:28

标签: javascript jquery ajax jquery-deferred

我有这段代码:

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调用结束后触发延迟对象?

由于

1 个答案:

答案 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 ( // ... );