Подтвердить что ты не робот

Как назначить обещание

Как назначить $обещание $scope.advertiserName? В приведенном ниже примере Console.log($ scope.title) возвращает "undefined".

 Restangular.all('advertiser').one("?id=" + 1).getList().then(function(data) {
   $scope.advertiserName = data.name;
   $scope.advertiserId = data.id;
 });

 $scope.title = $scope.advertiserName;
 $scope.id = $scope.advertiserId;
4b9b3361

Ответ 1

Мы можем использовать функцию обратного вызова для выполнения строк кода после получения ответа на вызов ajax. Вы можете посетить этот блог для удивительного объяснения функции обратного вызова http://javascriptissexy.com/understand-javascript-callback-functions-and-use-them/. Позволяет понять это с помощью кода.

    $scope.setNameId = function (title,id,callBackFunction) {
     Restangular.all('advertiser').one("?id=" + 1).getList().then(function(data) {
      // $scope.advertiserName = data.name;
       $scope.title= data.name;
      // $scope.advertiserId = data.id;
       $scope.id=data.id;
       callBackFunction();
     });
    }
     $scope.setNameId($scope.title,$scope.id,executeAfterResponse);
    var executeAfterResponse=function(){
    //code that you want to execute when value of $scope.title and $scope.id has changed
    };

Мы также можем сделать это с помощью этого подхода

$scope.setNameId(executeAfterResponse);

Без передачи переменной $scope.title и $scope.id в аргументе функции $scope.setNameId как $scope переменные могут быть доступны непосредственно внутри одного файла.

Комментируемые строки кода не требуются, поскольку мы непосредственно присваиваем значения $scope.name и $scope.id.

Ответ 2

Если я правильно вас понял, это происходит из-за асинхронного вызова.

Асинхронный означает, что отправка запроса (или, скорее, получение ответа) вынимается из обычного потока выполнения. В вашем примере, $.ajax возвращает немедленно, а следующий оператор возвращает результат;, выполненный до выполнения функции, которую вы передали, поскольку успешный обратный вызов был даже называется.

Вы должны сделать это как

$scope.someFunction = function () {
 Restangular.all('advertiser').one("?id=" + 1).getList().then(function(data) {
   return $scope.advertiserName = data.name;
 });
}
$scope.title = $scope.someFunction(); //It will give you output

Изменить 1:

Я прочитал много статей для того же самого и что я заметил, что ответ вызова asynchronous будет выведен из обычного потока выполнения. Или вы используете вызов restangule или $http, оба - вызов asynchronous. Поэтому компилятор не будет ждать вашего ответа. Вам нужно сообщить компилятору, что он ждет ответа ajax. Что я сделал в одном из моих проектов. Вот простой пример, который может проиллюстрировать больше.

Сначала я объявил функцию контроллера. Как ниже

$scope.asynchronousCallee = function (){
 $http.get('/url').
  success(function(data, status, headers, config) {
    $scope.myAjaData = data;
  });
}

$scope.asynchronousCallee(); //Call above function just after the declaration

Просто эта функция будет получать данные с сервера с вызовом get и назначать ответ в переменной, но обратите внимание, что эта функция успеха будет называться asynchronously. Итак, что я сделал, я вызвал функцию asynchronousCallee сразу после ее объявления. Теперь компилятор будет ждать ответа этой функции, и после выполнения функции компилятор продолжит работу. Надеюсь, это может помочь вам брат: -)

Ответ 3

В приведенном ниже примере вы ожидаете, что будет сохранена ссылка на имя рекламодателяName и заголовок и рекламодательId и id. Однако при вытаскивании свойств за пределы области действия он извлекается по значению не по ссылке. Если вы хотите, чтобы ваш код работал, вам придется сделать одну из двух вещей:

 Restangular.all('advertiser').one("?id=" + 1).getList().then(function(data) {
   $scope.advertiserName = data.name;
   $scope.advertiserId = data.id;
 });

 $scope.title = $scope.advertiserName;
 $scope.id = $scope.advertiserId;

Инициализировать правильное свойство в области:

 Restangular.all('advertiser').one("?id=" + 1).getList().then(function(data) {
     $scope.title = data.name;
     $scope.id = data.id;
 });

Сделайте вместо этого ссылку:

 var advertiser = {
     id: $scope.advertiser,
     title: $scope.advertiser
 }
 $scope.advertiser = advertiser;

 Restangular.all('advertiser').one("?id=" + 1).getList().then(function(data) {
     advertiser.title = data.name;
     advertiser.id = data.id;
 });

Поскольку promises с помощью angular уже запускает цикл дайджеста, представление будет обновляться

Ответ 4

 Restangular.all('advertiser').one("?id=" + 1).getList().then(function(data) {
   $scope.advertiserName = data.name;
   $scope.advertiserId = data.id;
    return { name : data.name, id : data.id };
 }, function(er){
    //Handle error
 })
.then(function(response){
  $scope.title = response.name;
  $scope.id = response.id;
}, function(er){
  //Handle error
});