7

インターセプターに関する AngularJSのドキュメント(バージョン 1.1) では、インターセプター関数はすべて次のようなものを返します

return response || $q.when(response);

ただし、私のアプリでは 'response' が常に定義されているため、 $q.when(response) は実行されません。したがって、問題は、「応答」が未定義になる状況と、何が未定義になるかです。

$q.when(response) // == $q.when(null)

行う!応答が未定義/nullだからですか?

4

2 に答える 2

13
  • $q.when(promise)promise
  • $q.when(nonPromise)promise指定された value に非同期的に解決されるnew nonPromise

何があるか見てみましょう$q.when

$q.when = function (foreignPromise) {
    var deferred = $q.defer();
    foreignPromise.then(function (data) {
        deferred.resolve(data);
        $rootScope.$digest();
    }, function (reason) {
        deferred.reject(reason);
        $rootScope.$digest();
    });
    return deferred.promise;
}

工場出荷時のリターン $q.when(data)

ご覧$q.whenのとおり、 promise または nonPromise を受け取り、それをラップします。

工場の例:

fessmodule.factory('Data', ['$resource','$q',  function($resource, $q) {
    var data = [
        {
            "PreAlertInventory": "5.000000",
            "SharesInInventory": "3.000000",
            "TotalSharesSold": "2.000000",
            "TotalMoneySharesSold": "18.000000",
            "TotalSharesBought": "0.000000",
            "TotalShareCost": "0.000000",
            "EstimatedLosses": "0.000000"
        }
    ]; 

    var factory = {
        query: function (selectedSubject) {                             
            return $q.when(data);
        }    
    }
    return factory;
}]); 

これでコントローラーから呼び出すことができます:

Data.query()
           .then(function (result) {
               $scope.data = result;                           
           }, function (result) {
               alert("Error: No data returned");
           });

デモFiddle

工場は $q.when(data) || を返します。データ

この例から、promise を返します。それでは、少し変更してみましょう。

代わりreturn $q.when(data);に、次のように書きます。

return $q.when(data) || data;

それもうまくいきます。しかし、その逆ではありません。

私が理解しているように、Angular はコントローラーがDataサービスから待機していることを認識しており、上記のステートメントは 1st off を使用し$q.when(data)ます。

デモ 2Fiddle

|| 工場出荷時の戻りデータ || $q.when(データ)

Data次の方法でサービスを呼び出しましょう。

$scope.data =  Data.query();

約束はありません。通話は同期されます。

工場は次のようになります。

fessmodule.factory('Data', ['$resource','$q',  function($resource, $q) {
    var data = [
        {
            "PreAlertInventory": "5.000000",
            "SharesInInventory": "3.000000",
            "TotalSharesSold": "2.000000",
            "TotalMoneySharesSold": "18.000000",
            "TotalSharesBought": "0.000000",
            "TotalShareCost": "0.000000",
            "EstimatedLosses": "0.000000"
        }
    ]; 

    var factory = {
        query: function (selectedSubject) {                             
            return  data || $q.when(data);
        }
    }
    return factory;
}]);

デモ 3Fiddle

私の結論

私たちのreturn data || $q.when(data)サービスが単一の値または約束を返すことができることを意味します。しかし、サービスが返すデータの種類はわかっているため、このステートメントには意味がありません。またはdataまたはpromise

于 2013-11-04T15:32:02.620 に答える
1

ステートメント:

return config || $q.when(config);

//AND

return response || $q.when(response);

インターセプターのドキュメントの V1.1 に示されています。それ以降のバージョンのドキュメントからは削除されました。インターセプター関数が値または約束のいずれかを返すことができることを文書化するのは、誤った試みだったと思います。

それ以外の場合、ステートメントは意味がなくconfigresponse常に参照があります。

于 2018-12-21T11:57:14.427 に答える