Сохранение ответа на запрос Google JavaScript API

Пробуя Google Javascript API с Google+, я столкнулся с проблемой.

var response;
var request = gapi.client.request({
    'path': '/plus/v1/people/' + "THEUSERID", 
    'params': {}});
request.execute(function(resp){});

Функция выполнения (gapi.client.HttpRequest.execute) принимает один аргумент; функция обратного вызова. Однако я не хочу обрабатывать данные сразу после их получения, я хочу сохранить их в переменной response, которую я объявил в начале кода. Есть ли способ использовать аргумент обратного вызова для хранения ответа?

Простите меня, если у этого есть очевидное решение, я немного новичок в JavaScript.

РЕДАКТИРОВАТЬ: было предложено, чтобы функция обратного вызова была следующей:

request.execute(function(resp){response = resp;});

Однако с функцией происходит нечто любопытное. Вот код, который я использовал для тестирования:

var response;
var request = gapi.client.request({
    'path': '/plus/v1/people/' + userID,
    'params': {}});
request.execute(function(resp){
    console.log("RESP:");
    console.log(resp);
    response = resp;});
console.log("RESPONSE:");
console.log(response);

Консоль выводит следующее:

RESPONSE:
undefined
GET https://www.googleapis.com/plus/v1/people/104815258973759324455?key=XXXXXXX
RESP:
({theactualjsondatathatIreceivedfromthecall})

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


person Tanaki    schedule 28.02.2012    source источник


Ответы (1)


person    schedule
comment
Это должно сделать это. OP, имейте в виду, что ваша переменная response имеет область действия функции, в которой она находится (если она находится в одной). Поэтому, если вам нужно использовать его за пределами этого, обязательно переместите объявление. - person shanabus; 28.02.2012
comment
Это должно работать, да, но похоже, что функция execute() обрабатывает обратный вызов немного иначе, чем я думал; Я отредактировал основной вопрос, чтобы отразить проблему. - person Tanaki; 28.02.2012
comment
Обратный вызов, скорее всего, асинхронный. - person Ivan; 28.02.2012
comment
Большой; что я могу сделать, чтобы заставить код ждать, пока все данные не будут переданы? - person Tanaki; 28.02.2012
comment
Поместите код после execute в функцию и вызовите ее в конце обратного вызова execute. Я обновил свой ответ в качестве примера. - person abraham; 28.02.2012