0

アプリケーションでは、jQuery deferred を使用して、Ajax の成功とエラー処理を中央の場所に実装したいと考えています。データ オプションに文字列を入れるとすべてがうまく機能しますが、データ オプションに配列を入れたい場合は、これを文字列として送信します。

私の延期された実装:

Application = {
ajax: function(options) {
    var deferred = $.Deferred(function (d) {
        var defaults = {
            cache: false,
            type: 'post',
            traditional: true,
            dataType: 'json'
        },
        settings = $.extend({}, defaults, options);

        d.done(settings.success);
        d.fail(settings.error);
        d.done(settings.complete);

        var jqXHRSettings = $.extend({}, settings, {
            success: function (response, textStatus, jqXHR) {
                /*
                JSON Reponse
                {
                    status: 'error' or 'success',
                    code: 200, (HTTP codes or own codes between 600 and 700 for business logic errors)
                    data: { <result> }
                }
                */
                if (settings.dataType === 'json') {
                    if (response.status == 'success') {
                        // Just resolve and give data back
                        d.resolve(response.data);
                    } else if (response.status == 'error') {
                        // Implement error handling
                        d.reject(response.data);
                    }
                } else {
                    d.resolve(response);
                }
            },
            error: function (jqXHR, textStatus, errorThrown) {
                console.log(jqXHR);
                d.reject(jqXHR);
            },
            complete: d.resolve
        });

        $.ajax(jqXHRSettings);
    });

    var promise = deferred.promise();
    promise.success = deferred.done;
    promise.error = deferred.fail;
    promise.complete = deferred.done;

    return promise;
}
};

この遅延関数の私の実装 (動作しません!):

// Retrieve all sessions from fullcalendars
        var ajax = Application.ajax({
            url: Routing.generate($this.options.ajaxScheduleSessionsRoute, { _format: 'json', id: this.options.scheduleId }),
            data: {
                "rooms": $this._rooms // $this._rooms is an array! [1, 2, 3, 4, 5]
            }
        });
        ajax.fail(function(jqXHR, textStatus, errorThrown){
            console.log(jqXHR);
        });
        ajax.done(function(response, textStatus, jqXHR){
            console.log(response);
        });

結果 ([] がありません)

結果 ([] がありません)

上記の遅延関数を使用する前の jQuery ajax のデフォルトの実装 (これは機能します!):

$.ajax({
            type: 'POST',
            url: Routing.generate($this.options.ajaxScheduleSessionsRoute, { _format: 'json', id: this.options.scheduleId }),
            data: {
                "rooms": $this._rooms
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                console.log('status:' + XMLHttpRequest.status + ', status text: ' + XMLHttpRequest.statusText);
            },
            success: function(data) {
                $.each(data, function( key, source ) {
                    var roomId = key;
                    console.log(source);
                    $('#calendar'+key).fullCalendar( 'addEventSource', source );
                });
            },
            dataType: 'json'
        });

結果 ([] 付き)

結果 ([] 付き)

質問: jQuery Ajax を使用したデフォルトの実装が機能し、遅延関数が機能しないのはなぜですか?

4

1 に答える 1

0

ああ、私はこの質問を提出し、その後、遅延関数で従来のオプションを見ました:(私はそれを削除しましたが、今ではうまく機能しています。それが何かばかげていることがわかりました;-)

だから、使わないで

var defaults = {
        cache: false,
        type: 'post',
        traditional: true,
        dataType: 'json'
    },

しかし、使用

var defaults = {
        cache: false,
        type: 'post',
        dataType: 'json'
    },
于 2013-09-18T07:56:50.643 に答える