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

Множественные `.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, я ошибся; фактически две функции работают параллельно, как только обещание успешно разрешено, и они не связаны цепью и поэтому не зависят друг от друга. Спасибо за вашу помощь.

4b9b3361

Ответ 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);
});