Мне нужно получить значение localeData, чтобы распечатать часть функции ниже. Я знаю, как печатать в стороне от функции, как то, что я сделал здесь. Я пробовал это, но не работал.
$http.post(SERVER_URL + 'getLocaleData').success(function(localeData) {
console.log(localeData);
}).error(function(err) {
alert('warning', err.message);
});
//need to get that value here.
console.log(localeData);
РЕДАКТИРОВАТЬ
На самом деле мне нужно сделать это
app.factory('customLoader', function($http, $q, SERVER_URL) {
return function(options) {
var deferred = $q.defer();
// do something with $http, $q and key to load localization files
$http.post(SERVER_URL + 'getLocaleData').success(function(localeData) {
//do something here to localData
}).error(function(err) {
alert('warning', err.message);
});
deferred.resolve(localeData);
return deferred.promise;
};
});
Это то, что мне нужно. наконец, мне нужно отправить localeData.
Вам не нужно $ q для достижения вашей цели:
app.factory('customLoader', ["$http", "SERVER_URL", function($http, SERVER_URL) {
return function(options) {
return $http.post(SERVER_URL + 'getLocaleData');
};
}]);
Потому что $http
и все его удобные методы действительно возвращают обещание. В этом случае вы можете использовать эту услугу следующим образом:
customLoader(options).success(function(localeData){
//do something here to localData
}).error(function(err){
alert('warning', err.message);
});
Если вы действительно должны использовать $q
, то это должно сделать:
app.factory('customLoader', ["$http", "$q", "SERVER_URL", function($http, $q, SERVER_URL) {
return function(options) {
return $q(function(resolve, reject){
$http.post(SERVER_URL + 'getLocaleData').success(function(localeData) {
//do something here to localData
resolve(localeData); // ultimately you ought to resolve inside this function
}).error(function(err) {
alert('warning', err.message);
reject(localeData); // ultimately you ought to reject inside this function
});
});
};
}]);
Вам не нужно создавать и разрешать отсрочку самостоятельно. Есть более простой способ. (Также в примере, который вы даете, вы разрешаете обещание до завершения базового ajax)
Услуга Angular.js $http
соответствует интерфейсу $q
! Поэтому вы можете написать:
app.factory('customLoader', function($http, $q, SERVER_URL) {
return function(options) {
var promise = $http.post(SERVER_URL + 'getLocaleData')
.then(function(localeDataBag) {
var localeData = localeDataBag.data; // .data of 'then' equals to what .success returns.
modifiedLocaleData = localeData++; // do something here to localData
return modifiedLocaleData; // This is the new result
})
.catch(function(err) {
console.log(err);
return $q.reject(err); // This is the new result if something failed. Since we are chaining promises, we should keep failure state.
});
return promise;
};
});
Следующим способом вы можете получить доступ к ответу своего сервера за пределами фабрики в контроллере:
app.factory('customLoader', function ($http, $q) {
return {
response: {},
getLocalData: function (param) {
var deferred = $q.defer();
$http.post(SERVER_URL + 'getLocaleData', param).
success(function (data, status, headers, config) {
deferred.resolve(data);
}).
error(function (data, status, headers, config) {
});
return deferred.promise;
}
}
});
app.controller('yourCtrl', function($scope,customLoader) {
$scope.GetLocaleData= function() {
customLoader.getLocalData({
Role: role,
Email_Id: $scope.Email,
Pwd: $scope.Password
}).then(function(localeData) {
$scope.Data = localeData;
});
}
});
JS является асинхронным, что в основном означает, что ваш последний console.log
будет выполнен до того, как ваш сервер вернет любые данные. Поэтому вы должны сделать это в своих обещаниях:
$http.post(SERVER_URL + 'getLocaleData').success(function(localeData) {
console.log(localeData);
}).error(function(err) {
console.log(err);
alert('warning', err.message); //Just in case you didn't know, this line supposes that your server returns a JSON object with a "message"-property
});
Таким образом, ваш сервер-ответ будет console.log
с успехом и неудачей.
var response; //First, declare a variable in the parent scope.
$http.post(SERVER_URL + 'getLocaleData').success(function(localeData) {
response = localeData; //Assign the response data to the variable.
console.log(localeData);
}).error(function(err) {
alert('warning', err.message); //Just in case you didn't know, this line supposes that your server returns a JSON object with a "message"-property
});
console.log(response);
Однако пример не будет оцениваться, как вы ожидаете. Последний console.log будет просто зарегистрировать undefined
.
q
.
localeData
ограничена областью функции .success
. Вы не можете получить его снаружи, если вы не назначили ему какую-то другую переменную.
var data = ""
$http.post(SERVER_URL + 'getLocaleData').success(function(localeData) {
data = localeData;
}).error(function(err) {
alert('warning', err.message);
});
//need to get that value here.
console.log(data);
Но не ожидайте получить желаемое значение в data
пока не получите ответ. $http.post
- асинхронный
Взгляните на обещания преодолеть такие проблемы, потому что они используются повсюду в угловом мире.
ОБНОВИТЬ:
Как вы это сделали в редактировании, вы можете использовать службу $ q, например:
app.factory('customLoader', function($http, $q, SERVER_URL) {
return function(options) {
var deferred = $q.defer();
// do something with $http, $q and key to load localization files
$http.post(SERVER_URL + 'getLocaleData').success(function(localeData) {
//do something here to localData
}).error(function(err) {
alert('warning', err.message);
});
deferred.resolve(localeData);
return deferred.promise;
};
});
ИЛИ, вы можете просто вернуть $http.post
который сам возвращает обещание
app.factory('customLoader', function($http, $q, SERVER_URL) {
return function(options) {
return $http.post(SERVER_URL + 'getLocaleData');
};
});
В любом случае вы возвращаете объект обещания, а не только фактический ответ, который вы получаете от сервера. localeData
можно получить следующим образом:
customLoader().success(function(res){
console.log(res);
}).error(function(){
//show some error message
})