Добавление нескольких параметров / аргументов в функцию обратного вызова jsonp - PullRequest
2 голосов
/ 02 июля 2011

Как мне указать больше аргументов для передачи функции обратного вызова jsonp?

Например, я пытаюсь получить видеоданные с YouTube:

http://gdata.youtube.com/feeds/api/videos/gzDS-Kfd5XQ?v=2&alt=json-in-script&callback=youtubeFeedCallback

Функция обратного вызова javascriptбудет вызван youtubeFeedCallback, и он будет содержать только один аргумент при вызове.

На данный момент функция будет выглядеть примерно так:

function youtubFeedCallback(response) {
...
}

Что бы я хотел сделатьэто передать второй аргумент, подобный этому,

function youtubeFeedCallback(response, divId) {
...
}

Возможно ли это сделать.Я пытался искать везде онлайн и ничего не мог найти.Спасибо!

Ответы [ 2 ]

5 голосов
/ 02 июля 2011

Вы не можете добавлять аргументы в функцию обратного вызова, как это. Однако вы можете сгенерировать функцию-оболочку. Функция обратного вызова JSONP просто должна была быть функцией в пространстве имен по умолчанию, это означает, что вам просто нужно добавить сгенерированную функцию с известным именем к глобальному объекту window. Шаг первый - составить имя:

var callback_name = 'youtubeFeedCallback_' + Math.floor(Math.random() * 100000);

В реальном мире вы бы хотели обернуть это в цикл и проверить, что window[callback_name] еще не занято; Вы можете использовать window.hasOwnProperty(callback_name) для проверки. Когда у вас есть имя, вы можете создать функцию:

window[callback_name] = function(response) {
    youtubeFeedCallback(response, divId);
};

Хотелось бы еще кое-что поднять, хотя:

function jsonp_one_arg(real_callback, arg) {
    // Looping and name collision avoidance is left as an exercise
    // for the reader.
    var callback_name = 'jsonp_callback_' + Math.floor(Math.random() * 100000);
    window[callback_name] = function(response) {
        real_callback(response, arg);
        delete window[callback_name];  // Clean up after ourselves.
    };
    return callback_name;
}

Если у вас есть что-то подобное, вы можете просто позвонить:

jsonp = jsonp_one_arg(youtubeFeedCallback, divId);

А затем используйте значение jsonp в качестве значения callback в URL YouTube.

Вы могли бы также создать больше таких функций для обработки более длинных списков аргументов. Или вы можете построить универсальный с arguments и apply.

0 голосов
/ 02 июля 2011

лучший способ - указать связанный массив divId и videoId следующим образом:

var arr = {
    'gzDS-Kfd5XQ': 'divId_1',
    'gwWS-Gasfdw': 'divId_2'
};

и в функции обратного вызова получите ваш divId по videoId

function youtubFeedCallback(data)
{
    var divId = arr[data.entry.media$group.yt$videoid.$t];
}
...