Необходима система очередей javascript ajax.Кросс-домен jsonp.Как бы я это сделал? - PullRequest
0 голосов
/ 24 ноября 2011

У меня есть этот код JavaScript, который я хочу изменить в систему очередей.В настоящее время мне приходится кодировать это так.Это становится грязным, когда есть длинная цепь запросов.Примечание. Мои запросы функций возвращают объекты json.Установка async в false не используется для междоменных вызовов jsonp, поэтому не будет работать.Звонки должны быть сделаны в этом порядке.Очереди Jquery не будут работать.

var customers;
var orders;
var products;
function GetCustomers(){
            $.ajax({
                url: somecrossdomainurl?calback=GetCustomerCallback,
                dataType: 'jsonp',
                async: false
            });
}

function GetCustomerCallback(data){
            customers=data;
            GetCustomersOrder();
        }

function GetCustomersOrder(){
                $.ajax({
                    url: somecrossdomainurl?calback=GetCustomersOrderCallback,
                    dataType: 'jsonp',
                    async: false
                });
        }

function  GetCustomersOrderCallback(data){
    orders = data;
    GetOrderProducts();
}

function GetOrderProducts(){
        $.ajax({
            url: somecrossdomainurl?calback=GetOrderProductsCallback,
            dataType: 'jsonp',
            async: false
        });
}

function  GetOrderProductsCallback(data){
    products = data;
    DisplayCustomersAndOrder();
}

function DisplayCustomersAndOrder(){
    //loop round customer,order,products and display info
}


//I want to do something like this:

function DisplayData(){
    var queue;

    queue.GetCustomer();
    queue.GetCustomersOrders();
    queue.GetOrderProducts();
    queue.DisplayCustomersAndOrder();
    queue.Start()
}

Любые предложения

1 Ответ

0 голосов
/ 04 июня 2013

Это реализация асинхронной очереди с использованием обещаний.https://gist.github.com/thejuan/5697765

Он написан на TypeScript, но слишком мало, чтобы перейти на чистый JS.

Продолжается при ошибке, если вы этого не хотите, есть более простые решения, чем эта (просто цепочкакаждый из ваших вызовов, используя затем)

Примечание: Требуется Jquery 1.8 или выше, когда они сделали .then ведут себя "правильно"

export class AsyncExecutionQueue{

    private tail: JQueryPromise = $.Deferred().resolve();

    public enqueue(cmd:()=>any): JQueryPromise {

        console.log("Queuing Command");
        var next = $.Deferred();
        var client = $.Deferred();
        this.tail.always(() => {

            try {

                var result = cmd();
                if (result.done && result.fail) {
                    result
                    .done(client.resolve, next.resolve)
                    .fail(client.reject, next.resolve);
                }
                else {
                    client.resolve(result);
                    next.resolve();
                }
            }
            catch (e) {
                client.reject(e);
                next.resolve();
            }
        });
        this.tail = next;
        return client;
    }
}
...