Каков наилучший способ вызова функции в YUI3 только в случае успешного выполнения серии запросов XHR (IO)? - PullRequest
0 голосов
/ 06 декабря 2009

Полагаю, этот вопрос относится не только к YUI, но я использую библиотеку JS, и конкретный ответ будет полезен.

Обычно при загрузке страницы я хочу, чтобы скрипт запускал несколько XHR с использованием Y.io, и если они все возвращают данные успешно, тогда я хочу, чтобы скрипт перешел к следующему шагу, который будет манипулировать полученными данными. .

Я могу придумать несколько способов сделать это, но все они кажутся мне немного неуклюжими, и я надеюсь, что у кого-то есть лучшее предложение. Мои идеи пока:

  1. Объедините все данные, которые я хочу, в один ответ JSON, так что, если этот запрос хорош, продолжайте. (Это решение мне нравится меньше всего).
  2. Когда первый запрос Y.io возвращается успешно, вызывается следующий и т. Д., А когда последний успешно, тогда я знаю, что все успешно, и перехожу к следующему шагу сценария.

Есть идеи получше? Мне сейчас не очень нравится, но я склоняюсь к варианту два.

Ответы [ 2 ]

2 голосов
/ 06 декабря 2009

Вам не нужно ставить в очередь звонки Y.io. Просто отправь их всех сразу, а когда они все вернутся, продолжай.

var data = {};

function step(id, o, part) {
    try {
        data[part] = Y.Lang.JSON.parse(o.responseText);

        if (data.a && data.b && data.c) {
            processData(data);
        }
    }
    catch (e) {
        /* handle bad JSON, failure case */
    }
}

Y.io(a_url, { on: { success: step }, 'arguments': 'a' });
Y.io(b_url, { on: { success: step }, 'arguments': 'b' });
Y.io(c_url, { on: { success: step }, 'arguments': 'c' });
1 голос
/ 06 декабря 2009

Обе реализации имеют свои достоинства:

  1. Этот метод уменьшает количество транзакций, что снижает накладные расходы на транспортировку
  2. Этот метод, возможно, уменьшает общий объем данных, передаваемых по сети, и уменьшает время задержки пользовательского интерфейса, позволяя клиентской стороне быстрее приступить к работе, пока другие запросы находятся в очереди.

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

Если вам нужно / можно начать обработку данных раньше, чем позже, предпочтителен второй метод. Если перед обработкой требуются все данные, тогда необходим первый метод. Это действительно все зависит от вашей ситуации. Как правило, если вы можете использовать его, предпочтительнее использовать второй метод (multipart, а не один большой ответ).

...