0

私はAngularアプリに取り組んでおり、サービスを呼び出すコントローラーがあります。コントローラーは Url をサービスに送信します。サービスはその URL に GET 要求を送信し、JSON を受信します。その JSON は、Http 要求の Uri です。その Uri を JSON から抽出し、ブラウザーをそれにリダイレクトします。

エンドポイントから返されるJSONは次のようになります

{  
   "profile":"...",
   "releases_url":"http://...",
   "name":"...",
   ...,
   "uri":"http://the-value-i-want-to-return.com",
   ...,
}

サービスコード

// Resolves an API endpoint link to its Http counterpart
function resolveJSONEndpointToHttpUrl(JSONEndpointUrl) {
    return $http({ method: 'GET', url: JSONEndpointUrl }).
        success(function (data, status, headers, config) {
            console.log("resolveJSONEndpointToHttpUrl : data");
            console.log(data);

            //return data;
        }).
        error(function (data, status, headers, config) {});
}

コントローラーコード

function redirectViaJSONLink(url) {
    return musicCollectionService.resolveJSONEndpointToHttpUrl(url).then(function (data) {
        console.log("redirectViaJSONLink : data");
        console.log(data);
        console.log("redirectViaJSONLink : data.data");
        console.log(data.data);
        console.log("redirectViaJSONLink : data.data.uri");
        console.log(data.data.uri);

        // Perform redirection
        // $window.location.href = data.uri;
    });
}

ご覧のとおり、ロギングを行って JSON を分解し、何が返されているか、返されたオブジェクトのプロパティにアクセスする方法を正確に把握しています。

私の質問は次のとおりです。

  1. 通話return data;で必要ないのはなぜですか? $http .successどのような状況で必要ですか?
  2. Controller メソッドで$http .success呼び出す必要がないように、呼び出しでデータ オブジェクトから特定のプロパティを返す方法はありますか? data.data.uriまたは、コントローラーに返される前に、返された JSON ペイロードを変更できますか?
4

1 に答える 1

0

promiseを使用する場合、.successまたは.errorpromise から取得する場合、Angular は戻り値に対して何もしないため、何も返しても意味がありません。コールバックに渡される値.success/.errorは、元の promise の結果です。

ただし、使用する.then(success,error)と、戻り値はプロミス チェーンの次のプロミスに渡されます。

たとえば.then、URI を使用して返すようにサービスを変更できます。

サービス

// Resolves an API endpoint link to its Http counterpart
function resolveJSONEndpointToHttpUrl(JSONEndpointUrl) {
    return $http({ method: 'GET', url: JSONEndpointUrl }).
        then(function (data, status, headers, config) {
            console.log("resolveJSONEndpointToHttpUrl : data");
            console.log(data);

            return data.data.uri;
        });
}

コントローラ

次に、コントローラーで結果を処理できます。

function redirectViaJSONLink(url) {
    return musicCollectionService.resolveJSONEndpointToHttpUrl(url).then(function (uri) {

        // Perform redirection
        $window.location.href = uri;
    });
}
于 2014-08-05T03:07:07.477 に答える