Множественные `.then()` s на одном угловом обещании - все используют _original_ данные
Я пишу приложение angularjs, полагаясь на promises, и хотя он работает, мне интересно, могу ли я сделать это более оптимально.
В начале кода я создаю обещание, которое отправляется для получения некоторых данных. Когда это будет сделано, я хочу запустить несколько функций, которые используют все эти данные. Функции прикреплены к несвязанным частям приложения, поэтому я не знаю порядка, в котором они привязаны к обещанию. Их также не нужно делать в последовательности.
app.service("Fetch", function ($q){
return function() {
var def = $q.defer();
somelibrary.asynccall(function(error, data){ //callback
if (error) def.reject(error);
else def.resolve(data);
});
return def.promise;
};
});
app.controller("ctrl", function ($scope, Fetch) {
var prom = Fetch();
//somewhere:
prom.then(function(data){$scope.var1 = data["VAR1"];});
//somewhere else:
prom.then(function(data){$scope.var2 = data["VAR2"]});
});
Основной недостаток заключается в том, что более поздние then
выполняются только тогда, когда предыдущие завершены, что здесь не нужно.
Кроме того, мне нужно добавить return data
внутри каждого function(data){...}
, в противном случае следующий then()
не имеет доступного data
.
Нет ли другого способа сделать это, более подходящего для этой ситуации?
EDIT: как упоминалось @jfriend00, я ошибся; фактически две функции работают параллельно, как только обещание успешно разрешено, и они не связаны цепью и поэтому не зависят друг от друга. Спасибо за вашу помощь.
Ответы
Ответ 1
Превращение моего комментария в ответ, поскольку он, похоже, устраняет проблему:
С вашим шаблоном два вызова .then()
по одному и тому же обещанию будут вызваны один за другим, когда обещание будет разрешено. Второй .then()
имеет отношение только к первоначальному обещанию и не имеет ничего общего с тем, что происходит с первым .then()
.
Они не привязаны к цепочке, поэтому второй .then()
не имеет зависимости от того, что возвращается из первого .then()
, и оба будут переданы одни и те же данные. Это всего лишь несколько наблюдателей того же обещания, что и два обработчика событий, прослушивающих одно и то же событие.
Два обработчика .then()
по одному и тому же обещанию будут вызваны в том порядке, в котором они были привязаны к обещанию, и оба будут переданы одинаковые данные.
Смотрите два ответа:
Есть ли разница между обещанием. затем.если против обещания. Обещай. Затем
Понимание javascript promises; стеки и цепочка
для получения дополнительной информации о цепочке p.then(...).then(...)
против ветвления p.then(...); p.then(...)
с помощью promises.
Ответ 2
Вам нужно выполнить параллельное выполнение: $q.all()
$q.all(
function1,
function2,
function3
).then(function(responses) {
console.log(responses);
});