#javascript #angularjs
#javascript #angularjs
Вопрос:
У меня есть служба, которая не ожидает вызова функции success в контроллере. Компилятор анализирует строки после моего вызова из службы, а это не то, чего я хочу. Когда я перехожу в режим отладки, мои данные появляются там только через 10 мс или что-то в этом роде
.factory('myService', ['$http', '$q', function($http, $q){
var deferObject,
myMethods = {
getDepartments: function(d) {
console.log("Am ajuns");
var allDepartments=[];
var promise=$http.get("http://localhost:8087" "/projects/" d );
var deferObject = deferObject || $q.defer();
console.log("Am ajuns2");
promise.then(
// OnSuccess function
function(answer){
console.log("Am ajuns3");
// This code will only run if we have a successful promise.
deferObject.resolve(answer);
var setDepartments = new Set();
for (var i = 0; i < answer.data.length; i ) {
setDepartments.add(answer.data[i].department);
}
setDepartments.forEach(function (value) {
var department = {name: value};
allDepartments.push(department);
});
console.log(allDepartments);
return allDepartments;
},
// OnFailure function
function(reason){
// This code will only run if we have a failed promise.
deferObject.reject(reason);
});
return allDepartments;
},
getData: function(d) {
var promise=$http.get("http://localhost:8087" "/projects/" d )
var deferObject = deferObject || $q.defer();
promise.then(
// OnSuccess function
function(answer){
// This code will only run if we have a successful promise.
deferObject.resolve(answer);
},
// OnFailure function
function(reason){
// This code will only run if we have a failed promise.
deferObject.reject(reason);
});
return deferObject.promise;
}
};
return myMethods;
}]);
Комментарии:
1. как ваши getData, getDepartments должны возвращать обещание.
2. Почему вы разделяете одно и то же
deferObject
в нескольких обещаниях? Я могу избежать проблемы, если вы вызываете оба своих заводских метода одновременно, пока оба запроса все еще обрабатываются. Просто верните$http
вызов. Вы не можете вернуться из.then
такого обещания, вызывающий код изменился с момента его инициализации. К тому времени, когда обещание будет выполнено, делать нечегоreturn
. Вот почему вы везде используете promises, а не смешиваете и сопоставляете. Затем, когда вы возвращаетесь из одного обещания, оно передается следующему в цепочке.3. Я понимаю @ste2425, должен ли я возвращать только ответ http get?
4. К сожалению, я не могу написать полный ответ, поэтому придется сделать комментарий, очень кратко вы возвращаетесь из своего сервиса / фабрики
$http.get("http://localhost:8087" "/projects/" d )
, а затем в вызывающем коде, который вы можете сделатьmyService.getData().then(d => console.log(d));
. По сути$http
, возвращает обещание, поэтому верните его из вашей службы для подключения к вашему контроллеру и т. Д., Чтобы вы могли получать уведомления после завершения сетевого вызова. Вы также можете вложить цепочки обещаний и т. Д. Для сложных асинхронных рабочих процессов.5. Хорошо @ ste2425, большое вам спасибо!
Ответ №1:
Я решил проблему с помощью q.all , который ожидает завершения каждого запроса, и только после этого программа движется дальше.