Crossrider Extension API - var пусто, если я не вызову alert (var) после его настройки? JS проблема с областью?

0

Я использую простой запрос на получение, аналогичный тому, который приведен в примере, предоставленном 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.

Теги:
scope
get
crossrider

2 ответа

2
Лучший ответ

В общем, всякий раз, когда вы видите функцию обратного вызова в 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]

  • 0
    о, get_wishlists было оригинальным именем метода. Похоже, я пропустил это при обрезке этой части кода. Спасибо за подробный ответ.
0

Я просто понял это. Идеальная работа для этой задержки заключается в том, чтобы выполнять всю мою обработку только тогда, когда запрос возвращается успешно. Без этого я рискнул продолжить обработку, пока она не вернется (что обычно происходит, если я не использовал alert() или setTimeout(), чтобы задержать остальную часть моего кода от запуска.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню