2013-01-30 2 views
0

Может ли кто-нибудь объяснить мне, что не так с областью checkX()? Я подозреваю, что это неправильно - анонимная функция каким-то образом блокирует его, но я не уверен, как обойти это.Возвращаемое значение, обернутое вокруг анонимной функции в javascript

storage = chrome.storage; 

function checkX(){ 
    var x = false; 

    storage.sync.get(function(data){ 
     if(data.x == true){ 
       x = true; 
       console.log(x); // << x : true 
     } 
    }); 

      console.log(x); // << x : false 
    return x; 
} 

console.log заказ Результат:

x : false 
x : true 
+1

Javascript чувствителен к регистру: x! = X –

+0

После редактирования это типичная асинхронная проблема. – kapa

+0

Я добавил некоторую информацию о storage.sync в свой вопрос –

ответ

1

2 вещи, которые могли бы, вероятно, й will- бросить вас:

  1. JavaScript чувствительны к регистру
  2. метод get, используемые вами являетесь асинхронным, ваш IIFE возвращает до пропущенного функция обратного вызова выполняется, поэтому она вернет значение x, прежде чем обратный вызов изменит его.

Edit:
Метод get просто геттер, достаточно справедливо, однако существует большая разница между chrome.storage.sync.get, который получает данные с помощью Google Sync и chrome.storage.local.get, что (почти) то же самое как использование объекта localStorage, с дополнительными преимуществами событий. По крайней мере, это то, что мне говорят на первый взгляд Google's docs?

Из приведенных ниже комментариев:
Проблема здесь в том, как и когда JS вызывает функцию обратного вызова. Несмотря на то, что получатель, используемый OP, получает локальные данные, IIFE должен возвращаться первым, прежде чем JS, будучи однопоточным, может вызвать обратный вызов. Вот почему IIFE возвращает false.

+0

Я случайно заглавными X, это не актуальная проблема. Я также добавил некоторую информацию о storage.sync в моем вопросе –

+0

@AdonisK .: Ну, добавленная информация фактически подтверждает, что проблема заключается в асинхронном характере метода 'get', как я сказал в моем втором пункте: IIFE вызываемый, вызывает метод get и возвращает, когда метод get get получает ответ, он вызывает функцию обратного вызова. К тому времени IIFE уже давно вернулся ... –

+0

, но функция 'get' - это просто функция getter, она не включает метод HTTP GET. –

0

Javascript чувствителен к регистру. Что вы делаете, так это создание глобальной переменной x, которая равна true, тогда как локальная переменная X остается false.

storage = chrome.storage; 

function checkX(){ 
    var X = false; 

    storage.sync.get(function(data){ 
     if(data.x == true){ 
      x = true; <--- global variable 
     } 
    }); 

    return x; 
} 

Другой вопрос, будет ли ваша функция будет выполнена в storage.sync.get бежит асинхронные из «checkX», что означало бы, что сначала вернуть е и только позже (после того, как вы вернули его). Это произойдет точно, если storage.sync.get - это вызов ajax.

+0

Я случайно заглавную X, это не настоящая проблема. Я также добавил некоторую информацию о storage.sync в моем вопросе –

Смежные вопросы