0

使用事例

a に続いて aを実行してクリーンアップする$resource呼び出しがあります。サーバーを待っている間、ユーザーはシステムと対話する可能性があり、メソッドの前にメソッドを追加したいと考えています。thenfinallythenfinally

then定義済みの前に実行される既存の$promiseチェーンにメソッドを追加するにはどうすればよいfinallyですか?

サンプルコード

以下は、目的のユース ケースの簡略化されたコード サンプルです。メソッドを既存のチェーンに追加すると、 、、または何らかのルーチンthenによってトリガーされる可能性があります。$on$watch

function ctrl($scope, $timeout) {
    var a = $timeout(function() {
        console.log("Time out complete");
        return this;
    }, 1000).finally(function() {
        console.log("Finally called!");
    });

    // some logic

    // some events

    // some stuff happens

    // then something might insert this 
    // into the promise chain.
    a.then(function() {
        console.log("Another then!");
    });
};

結果

望ましい結果:

> Time out complete
> Another then!
> Finally called!

現在の結果:

> Time out complete
> Finally called!
> Another then!

デモ

jsフィドル

4

1 に答える 1

1

then潜在的な呼び出しを最初からチェーンに含める必要があります。ただし、コールバックから無限に新しい約束を返すことができます。

var todo = [];
function checkTodos() {
    if (todo.length)
        return todo.shift()().then(checkTodos);
        // do the chained task, and when finished come back to check for others
    else
        return todo = null;
}
function add(task) {
    if (todo)
        todo.push(task);
    else
        throw new Error("Sorry, timed out. The process is already finished");
}

$timeout(function() {
    console.log("Time out complete");
    return this;
}, 1000).then(checkTodos).finally(function() {
    console.log("Finally called!");
});

// some stuff happens
// then something might insert this into the promise chain:
add(function() {
    console.log("Another then!");
});
// Assuming it was fast enough.
于 2014-07-09T14:32:30.030 に答える