JavaScript / jQuery - «Массив» аргументов - возможно? - PullRequest
0 голосов
/ 03 сентября 2010

Выполнение некоторой клиентской разработки JavaScript, которая требует от меня вызова клиентского API, который принимает только один параметр за раз ( кашель, кашель, facebook ).

В основном мне нужно вызвать метод API дважды:

someFBApi.requestPerms('email')
someFBApi.requestPerms('publish_stream')

Теперь у меня есть функция-оболочка для этого вызова, которая выглядит следующим образом:

function requestPermission(permission, callback) {
 someFBApi.requestPerms(permission, callback);
}

Но проблема в том, что мне нужно дважды вызывать функцию requestPermission из всех мест:

requestPermission('email', function(perm1granted) {
   requestPermission('publish_stream', function(perm2granted) {
      // do something with perm 1 and perm 2

Я бы хотел сделать это:

requestPermissions('email,publish_stream', function(firstPerm,secondPerm) {
   // do something with firstPerm, secondPerm

Я знаю, что должен вызывать FB API дважды (хорошо), но я хочу, чтобы в этой функции происходило «удвоение» (не везде). Знаешь, что я имею в виду?

Итак, я приму ответ в двух формах:

  • Могу ли я передать массив строк, повторить их? (может JSON?)
  • Delimeted-string, затем разбить строку в функции.

Имейте в виду, что функция возвращает значение, указывающее, было ли предоставлено разрешение. Поэтому он должен принять массив строк / разделенный список строк и вернуть массив / список разделенных строк.

Чем проще решение, тем лучше. (jQuery хорошо)

Ответы [ 3 ]

2 голосов
/ 03 сентября 2010

Используя некоторую манипуляцию с массивом, вы можете удалять элементы из массива permissions, а накапливать результаты в массиве results.Сложное использование параметра обратного вызова requestPerms приведет к тому, что наша функция будет вызываться один раз для каждого запроса на разрешение, который завершается вызовом пользовательской функции callback после выполнения всех запросов на разрешение.

function requestPermissions(permissions, callback, results) {
    if (typeof(results) == "undefined") {
        results = [];
    }

    // Call requestPerms with the first element in permissions and have
    // it add the result to the results array and then call requestPermissions()
    // again recursively to handle the next request.    
    if (permissions.length > 0) {
        var permission = permissions.shift();

        someFBApi.requestPerms(permission, function(result) {
            results.add(result);
            requestPermissions(permissions, callback, results);
        }
    }
    // We've handled all of the permission requests, so now--finally--call the
    // user's callback function.
    else {
        callback.call(results);
    }
}

# Usage
requestPermissions(
    ['email', 'publish_stream'],
    function(emailPerm, publishPerm) {
        // Do something with emailPerm and publishPerm.
    }
);

Это полностью не проверено, но эй, это то, что вы получаете бесплатно!

2 голосов
/ 03 сентября 2010

Не поддавайтесь искушению использовать решение для анализа строк. Массив чище и проще:

/* note: permisions is expected to be an array */
function requestPermission(permissions) {
    for (var i=0; i<permissions.length; i++) {
        doSomething(permissions[i]);
    }
}

Теперь, похоже, единственная проблема заключается в том, что делать с обратным вызовом. Я предполагаю, что API является асинхронным, и вы хотели бы что-то вроде этого:

doSomething(when_done)->doSomething...(finally)->execute_callback

Для этого вы можете использовать своего рода рекурсию. За исключением того, что в действительности это не будет рекурсия в традиционном смысле, поскольку каждый вызов происходит асинхронно. Что-то вроде:

/* note: permisions is expected to be an array */
function requestPermission(permissions,callback) {
    var p = permissions.shift();
    var f = callback;
    if (permissions.length > 0) {
        // if this is not the last permission then
        // call this function again in the callback:
        f = function () {
            requestPermission(permissions,callback);
        }
    }
    someFBApi.requestPerms(p,f);
}

Теперь вы можете использовать его так:

requestPermissions(['email','publish_stream'],finalCallback);
0 голосов
/ 03 сентября 2010

.

function requestPermissions(permissions, callback, ret) {
    // ret is a map of the success of the permissions
    if (!ret) ret = {};

    // Request the first permission in the array.
    FB.requestPerms(permissions[0], function (r) {
        ret[permissions[0]] = r;

        // If it was successful and there are more permissions 
        // to ask for, call requestPermissions again.
        // (If it wasn't successful, don't continue.)
        if (r && permissions[1])
            requestPermissions(permissions.slice(1), callback, ret);

        // Otherwise, call the callback.
        else
            callback(ret);
    });
}

requestPermissions(['email', 'publish_stream'], function (success) {
    if (success['email'] && success['publish_stream'])
        // ...
});

Приведенное выше решение работает последовательно, то есть одно за другим.Я не уверен, как работает API Facebook, но если он позволяет запрашивать несколько разрешений одновременно, это тоже может сработать:

function requestPermissions(permissions, callback) {
    var ret = {};
    var count = permissions.length;

    // jQuery to make things easier
    $.each(permissions, function (i, value) {
        FB.requestPerms(permissions, function (success) {
            ret[value] = success;

            if (--count == 0) // Last one?
                callback(ret);
        });
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...