jQuery - AJAX-запрос, использующий как резервный XHR, так и flXHR (Flash) - как минимизировать дублирование кода? - PullRequest
3 голосов
/ 28 сентября 2011

Мне нужно получить данные через междоменный XMLHttpRequest. Чтобы заставить это работать (почти) во всех браузерах, я сначала использую собственный XHR и, если это не удается, flXHR.

(Рабочий) код, который у меня сейчас есть для этого, выглядит следующим образом:

jQuery.support.cors = true; // must set this for IE to work

$.ajax({
    url: 'http://site.com/dataToGet', 
    transport : 'xhr',
    success: function(data) {
        console.log('Got data via XHR');
        doStuff(data);
    },
    error: function(xhr, textStatus, error) {
        console.log('Error in xhr:', error.message);
        console.log('Trying flXHR...');
        $.ajax({
            url: 'http://site.com/dataToGet',
            transport : 'flXHRproxy',
            success: function (data) {
                console.log('Got data via flXHR');
                doStuff(data);
            },
            error: function (xhr, textStatus, error) {
                console.log('Error in flXHR:', error.message);
                console.log('Both methods failed, data not retrieved.');
            }
        });
    }
});

Для меня это похоже на дублирование кода, особенно в обработчиках успеха. Есть ли более эффективный способ сделать это? Я действительно предпочел бы сделать один вызов $ .ajax, который бы попробовал оба транспорта по очереди, вместо того, чтобы использовать обработчик ошибок для повторного вызова. В этом примере это не так уж плохо, но быстро усложняется, если обработчик успеха длиннее или если обработчик успеха сам должен выполнить еще один вызов $ .ajax.

Ответы [ 2 ]

2 голосов
/ 08 мая 2012

Я создал специфичный для jquery и уменьшенный ветвь flxhr, который упрощает приведенный выше пример кода. Вы можете увидеть пример использования в разделе «Использование» в README.

https://github.com/b9chris/flxhr-jquery-packed

В частности, вы не хотите тратить время на ожидание сбоя стандартного запроса CORS. Легко определить, нужен ли flxhr, протестировав $.support.cors заранее (нет необходимости переопределять его). Тогда просто используйте flxhr там, где это необходимо.

1 голос
/ 28 сентября 2011

Почему бы вам просто не обернуть это в функцию отдельно?В конце концов, как вы в конечном итоге повторно использовать код.Вы даже можете передать функции в качестве аргументов, чтобы убедиться, что вам не придется повторять этот код более одного раза.

Для меня это довольно просто, но, возможно, я неправильно понял.

function xhr(success) {
    $.ajax({ 
        success: success, 
        error: function() { 
            $.ajax({ success: success }) 
        } 
    });
}

Затем просто передайте обработчик успеха один раз

xhr(function(data){/*magic*/});

Или, если вы хотите вообще избежать избыточной конфигурации вызова ajax, используйте первый объект в качестве шаблона, например:

function xhr(success) {
    var ajaxParams = { success: success };
    ajaxParams.error = function() { 
        $.ajax($.extend(ajaxParams, { transport: 'xhr' })); 
    }
    $.ajax(ajaxParams);
}

Я немного все упростил, но я надеюсь, что вы поняли.

Редактировать

Прочитав этот последний бит, возможно, это даст вам некоторые идеи ... это вариант этогопоследний фрагмент.

function xhr(success) {
    var ajaxParams = { success: success };
    ajaxParams.error = function() { 
        var newParams = $.extend(ajaxParams, { transport: 'xhr' });
        newParams.success = function() {
            // do something
            // arguments is a special array, even if no parameters were
            // defined in any arguments where passed they will be found
            // in the order they were passed in the arguments array
            // this makes it possible to forward the call to another 
            // function
            success.apply(this, arguments); 
        }
        $.ajax(newParams); 
    }
    $.ajax(ajaxParams);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...