javascript - 如何从延迟对象 JQuery 中获取返回值

标签 javascript

我正在编写一个函数来加载事件(用于日历),它应该返回要由 Mustache 解析的数据。 我遇到的问题是我找不到在 request.done() 中返回已处理数据的方法

这是我的功能

this.load = function() {
    var events = createArray(7, { content: [] });
    var data = {
        from: Math.floor(this.week[0].valueOf() / 1000),
        to: Math.floor(this.week[6].valueOf() / 1000)
    };
    var request = $.ajax({
        url: this.loadPath,
        data: data,
        type: 'POST'
    });

    request.done(function(response) {
        response = JSON.parse(response);
        response.forEach(function(event) {
            event.date = new Date(event.date);
            var thisEvent = {
                id: event.id,
                time: event.date.format('HH:MM'),
                title: event.title,
                description: event.description,
                color: event.color,
                link: event.link
            };

            // Why is thisEvent added to each events[].content and not just for events[day].content?
            events[event.date.getRealDay()].content.push(thisEvent);
        });
    });

    // return statement has to be executed only when request.done() has finished
    // or find a way to return directly from request.done()
    return { events: events };
};

谢谢你的帮助

编辑:找到解决方案

this.load = function() {
    var data = {
        from: Math.floor(this.week[0].valueOf() / 1000),
        to: Math.floor(this.week[6].valueOf() / 1000)
    };
    var request = $.ajax({
        url: this.loadPath,
        data: data,
        type: 'POST',
        context: this
    });
    var deferred = $.Deferred();

    request.done(function(response) {
        var events = createArray(7, { content: [] });
        response = JSON.parse(response);

        response.forEach(function(event) {
            event.date = new Date(event.date);
            var thisEvent = { // Why does the
                id: event.id,
                time: event.date.format('HH:MM'),
                title: event.title,
                description: event.description,
                color: event.color,
                link: event.link
            };
            events[event.date.getRealDay()].content.push(thisEvent); // Why is thisEvent added to each events[].content and not just for events[day].content?
        });
        deferred.resolveWith(this, events);
    });
    request.fail(deferred.reject);

    return deferred.promise();
};

从我可以调用的另一个函数:

this.load().done(function(events) {
    this.events = events;
    this.render();
});

最佳答案

一种解决方案是在完成后使用回调:

this.load = function(cb) {
//...
    request.done(function(response) {
       // do your stuff with the events etc.
        cb(events);
    }
};

然后像这样调用它

load(function(events){
    // events manipulated and ready to use
});

或者创建一个新的 promise 并解决它:

this.load = function() {
    var dfd = $.Deferred();
    //...
    request.done(function(response) {
       // do your stuff with the events etc.
       dfd.resolve(events);

    }).fail(dfd.reject); // reject on error

    return dfd.promise();
};

以类似的方式调用它:

load.done(function(events){
    // handle events
}).fail(function(){
   // handle errors
});

关于javascript - 如何从延迟对象 JQuery 中获取返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23406574/

相关文章:

javascript - 映射 2 数组属性

javascript - 如何在 Google Map API v3 中区分鼠标左键和右键单击 mousedown 事件

javascript - JS |当并非所有属性都存在时,按属性对对象数组进行排序

javascript - 如何在 iframe 加载网站时显示加载 gif?

javascript - 在javascript中解析QueryString

javascript - 如何从服务器请求json文件并放入?

javascript - 检测 Google map 街景模式

javascript - 垃圾回收和 DocumentFragment

javascript - Select2 - Ajax 搜索 - 记住最后的结果

javascript - 启动时默认打开 Firefox Web 控制台?