2015-02-18 6 views
0

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

app.factory("UserService", function(){ 
var foo = 'bar'; 
return { 
    init: function(){ 
     var self = this; 
     self.create(); 
    }, 
    create: function(){ 
     $.post(server+"api/users", { 
       uuid: self.uuid 
      }) 
      .done(function(data) { 
       if(data.reply !== 0){ 
        foo = true; 
       } else { 
        foo = false; 
       } 

      }); 
      return foo;     
     } 
    }; 
}); 

Почему я не могу изменить значение foo изнутри функций? Я пробовал делать this.foo, self.foo, после присвоения этого себе, среди многих других вещей, и я считаю, что я пропускаю что-то слишком очевидное, и я буду чувствовать себя идиотом после того, как кто-то его очистит меня.

Спасибо.

+1

Вы можете. То, что вы * не можете сделать, - это притвориться, что $ .post не является асинхронным и пытается * вернуть * его из асинхронной функции. –

+0

Как мне обойти это? Мне нужно знать, будет ли функция create() запускаться правильно или нет, могу ли я просто изменить foo внутри функции, а позже по строке проверить значение foo, не возвращая ничего? – aabreu

+0

Вы должны вернуть обещание. Проблема не в области или контексте. –

ответ

0

Попробуйте это:

app.factory("UserService", function(){ 
var foo = 'bar'; 
return { 
    init: function(){ 
     var self = this; 
     self.create(); 
    }, 
    create: function(){ 
     $.post(server+"api/users", { 
       uuid: self.uuid 
      }) 
      .done(function(data) { 
       if(data.reply !== 0){ 
        return true; 
       } else { 
        return false; 
       } 

      }); 

     } 
    }; 
}); 

Это должно возвращать истинным или ложным, когда функция asynchronus делается.

Cheers,

Валентин

+0

Не будет ли функция, называемая 'create', быть длинной? –

1

Глядя на ваш код, который вы должны сначала изменения $.post к $http.post, чтобы получить лучший контроллер над обвязки выполнения $ переваривать цикла после его выполнения, Использование JQuery внутри углового создаст больше проблем с областью digest цикл.

Ваш код не будет работать, потому что вы создали Ajax из кода и возвращаете переменную из-за пределов сделанного, она должна быть возвращена от завершения обещания с использованием done или метода успеха.

Сервис

app.factory("UserService", function($http) { 
    var foo = 'bar'; 
    return { 
     init: function() { 
      var self = this; 
      self.create(); 
     }, 
     create: function() { 
      return $http.post(server + "api/users", { 
        uuid: self.uuid 
       }) 
       .then(function(res) { 
        if (res.data.reply !== 0) { 
         return foo = true; //returning data when promise is resolved 
        } else { 
         return foo = false; //returning data when promise is resolved 
        } 

       }); 
     } 
    }; 
}); 

Надеется, что это может помочь вам, спасибо.

+0

, если я назначу функцию переменной, например; r = self.create(); а затем console.log (r); Я получаю [object Object] – aabreu

+1

, если вы хотите получить результат, затем из 'create()' do' self.create(). Then (function (data) {console.log (data); // здесь вы получите значение foo внутри данных}) '... Используйте затем, чтобы разрешить обещание цепочки, потому что метод создания возвращает объект обещания. –

+0

@DoYouEvenLift Помогло ли вам это? –

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