1. ホーム
  2. angularjs

[解決済み] angularjsのプロミスを返す前に解決することはできますか?

2022-08-01 20:28:35

質問

プロミスを返す関数を書こうとしています。しかし、要求された情報がすぐに利用できる場合があります。消費者が決定を下す必要がないように、それをプロミスでラップしたいのです。

function getSomething(id) {
    if (Cache[id]) {
        var deferred = $q.defer();
        deferred.resolve(Cache[id]); // <-- Can I do this?
        return deferred.promise;
    } else {
        return $http.get('/someUrl', {id:id});
    }
}

そして、このように使う。

somethingService.getSomething(5).then(function(thing) {
    alert(thing);
});

問題は、解決済みのプロミスに対してコールバックが実行されないことです。これは正当なことなのでしょうか?この状況を処理する良い方法はありますか?

どのように解決するのですか?

簡単な答えです。はい、できます。 AngularJSのプロミスを返す前に解決することができ、それはあなたが期待するように動作します。

から JB NizetのPlunkr からですが、元々尋ねられたこと(つまりサービスへの関数呼び出し)のコンテキスト内で、実際に現場で動作するようにリファクタリングされています。

サービスの内部では...

function getSomething(id) {
    // There will always be a promise so always declare it.
    var deferred = $q.defer();
    if (Cache[id]) {
        // Resolve the deferred $q object before returning the promise
        deferred.resolve(Cache[id]); 
        return deferred.promise;
    } 
    // else- not in cache 
    $http.get('/someUrl', {id:id}).success(function(data){
        // Store your data or what ever.... 
        // Then resolve
        deferred.resolve(data);               
    }).error(function(data, status, headers, config) {
        deferred.reject("Error: request returned status " + status); 
    });
    return deferred.promise;

}

コントローラの内部は...。

somethingService.getSomething(5).then(    
    function(thing) {     // On success
        alert(thing);
    },
    function(message) {   // On failure
        alert(message);
    }
);

誰かのお役に立てれば幸いです。他の回答があまり明確でなかったので。