Я использую простой запрос на получение, аналогичный тому, который приведен в примере, предоставленном Crossrider, для получения некоторого контента с соответствующего сайта. Возвращаемое содержимое должно выглядеть так:
"Your list: 1-Item,2-Salmon,3-Halibut";
Когда я использую alert(); метод для отображения содержимого GET сразу после его получения, все работает отлично (за вычетом всплывающего окна при каждом загрузке веб-страницы). Тем не менее, я обнаружил, что если я удалю оператор предупреждения, который был в примере Crossrider, myList var будет пустым (см. Код ниже).
appAPI.ready(function($) {
// Async GET Request
// appAPI.request.get({url, onSuccess, onFailure, additionalRequestHeaders}})
function get_wishlists(){
appAPI.request.get({
url: 'http://mysite.local/list/view/1?time='+$.now(),
onSuccess: function(response, additionalInfo) {
myList = String($(response).text());
return myList;
},
onFailure: function(httpCode) {
//alert('Error - Could not acquire a list of your wishlists. HTTP Code: ' + httpCode);
return null;
}
});
}
var myList = get_list();
// myList will be blank without this!
alert(myList);
if (myList.indexOf('Your list:')){
myList = myList.substr(myList.indexOf('Your list:')+10);
myList = myList.split(',');
} else {
alert('Could not get list from your account, server response: '+myList);
}
});
Мой вопрос в том, почему myList выходит из строя, когда я не сразу показываю его в поле предупреждения, и как я могу его избежать?
EDIT: На самом деле, мне даже не нужно предупреждать myList var, но может вызывать предупреждение ("полученные данные"); сразу после установки myList.
В общем, всякий раз, когда вы видите функцию обратного вызова в JavaScript, код запускается асинхронно, и то же самое относится к обратным вызовам API Crossrider. В вашем примере обратный вызов appAPI.request.get onSuccess вызывается только после получения данных, в то время как предупреждение вызывается сразу после запуска запроса и до получения данных.
Правильный способ закодировать это - разместить предупреждение в функции обратного вызова, чтобы он вызывал, когда данные были получены. Используя ваш код в качестве примера, он должен выглядеть примерно так:
appAPI.ready(function($) {
function get_wishlists() {
appAPI.request.get({
url: 'http://mysite.local/list/view/1?time=' + $.now(),
onSuccess: function(response, additionalInfo) {
myList = response;
alert(myList);
if (myList.indexOf('Your list:')) {
myList = myList.substr(myList.indexOf('Your list:') + 10);
myList = myList.split(',');
} else {
alert('Could not get list from your account, server response: ' + myList);
}
},
onFailure: function(httpCode) {
//alert('Error - Could not acquire a list of your wishlists. HTTP Code: ' + httpCode);
return null;
}
});
}
get_wishlists();
});
Дополнительно (и как в сторону). обратите внимание, что ваша функция get_wishlists никогда не вызывается, поскольку при установке myList вы вызываете другую функцию get_list.
[ Раскрытие информации: я сотрудник Crossrider]
Я просто понял это. Идеальная работа для этой задержки заключается в том, чтобы выполнять всю мою обработку только тогда, когда запрос возвращается успешно. Без этого я рискнул продолжить обработку, пока она не вернется (что обычно происходит, если я не использовал alert() или setTimeout(), чтобы задержать остальную часть моего кода от запуска.