Как назначить обещание
Как назначить $обещание $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;
Ответы
Ответ 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
});