2016-09-23 21 views
0

私は約束オブジェクトと同じ方法で解決しようとしています。Angularのdefer.resolveをJavascript Promiseオブジェクトで解決します。 別の言い方をすると、返されるダミーの約束オブジェクトを作成したいと思います。この約束は後で解決される予定です。角度で約束を延期/延期する

私はそれをこのように記述します。

... 
$scope.checkThis = { test: false }; 

function getPromise() { 
    var deferred = $q.defer(); 
    var data = [1, 2, 3]; 

    function resolvePromise() { 
     deferred.resolve(data); 
    } 

    $scope.$watch("checkThis.test", function(newVal, oldVal) { 
     if (newVal) { 
      resolvePromise(); 
     } 
    }); 

    return deferred.promise; 
} 

$scope.getData1 = function() { 
    return getPromise(); 
}; 

$scope.getData2 = function() { 
    return getPromise(); 
}; 

... 

どのように私はプレーンなJavascriptの約束のオブジェクトと同じことを達成するであろうか?いくつかの解決をトリガーするイベントが1つ($ scope.checkThis.testがtrueになる)、Promiseコンストラクターを使用する方法はわかりません。

+0

"*いくつかの解決策をトリガーするイベント*"とはどういう意味ですか?なぜそれは遅延のために働くのだろうが、約束のコンストラクタのためには働かないだろうか? – Bergi

答えて

3

標準の約束はrevealing constructor patternを使用します。それを行うには、簡単かつ有利な方法があります:

function getPromise() { 
    return new Promise(resolve => { 
    var data = [1, 2, 3]; 
    $scope.$watch("checkThis.test", function(newVal, oldVal) { 
     if (newVal) { 
     resolve(data); 
     } 
    }); 
    }); 
} 

を付けろ!標準の約束は角度ダイジェストループをトリガーしません。プロミスコールバック内のスコープに対する変更は、UIおよびウォッチャーに直ちに反映されないことがあります。これは、標準Promiseに約束した$qを変更できない理由です。

あなたのシナリオに明らかにするコンストラクタパターンを適用できない場合は、同様の遅延クラスを作成する方法があります。 このクラスを使用することを避けることができます。、私はちょうどここに残していますので、既存のコードを再構築する必要はありません。新しいコードでこれを使用する必要はありません:

class Deferred { 
    constructor() { 
    this.resolve = null; 
    this.reject = null; 
    this.promise = null; 

    this.promise = new Promise((resolve, reject) => { 
     this.resolve = resolve; 
     this.reject = reject; 
    }); 
    } 
} 
+1

この 'Deferred'クラスは、明らかになっているコンストラクタパターンが持つすべての利点を消滅させます。それを使用しないでください! – Bergi

+0

私が正しく理解していると、保留中の約束を返すPromiseファクトリを作成しています。これは私の場合に働きます。ありがとうございました。 @ベルギー:なぜそれを使用しない? – casenonsensitive

+0

@Bergi完全に正しい。私は、分散システムが関与するシナリオでのみ使用し、メッセージベースのプロトコルはコール応答ベースのプロトコルに変換する必要があります。この場合、保留中のすべての要求(たとえば、遅延など)をマップに格納し、適切な応答でそれらを取り出して解決するしか方法はありません。 –