2016-08-09 8 views
3

私は、約束をinspection2update.DamageTypeIdプロパティに返すHTTPサービスを持っており、さらに実行を続けます。angularjsデータのHTTPサービス待ち

HTTPサービス:

function post(objectTypeId, damageDescription) { 
    var defer = $q.defer(); 
    $http.post(serviceAddress + "save/" + objectTypeId + "/" + damageDescription).then(function (response) { 
     defer.resolve(response.data); 
    }); 
    return defer.promise; 
} 

ここで私は、コントローラでサービスを呼び出す方法:

inspection2update.DamageTypeId = damageTypesService.save(inspection2update.ObjectTypeId, self.dType); 

しかし、私は、サービスからデータを取得するまで待機し、それだけの後に、さらに実行する必要があります。

この目的のために、私は$qサービスを$ httpリゾルバの中で使用しますが、私のサービスとデータからは約束を得ています。

サービスでデータを待つためにコード内で変更する必要があるのは何ですか?

答えて

2

http呼び出しがデータの取得を完了した後に解決される約束を返しています。このサービスを使用する消費者は、解決する約束を待つ必要があり、thenはデータで何かをやります。

約束データを受信し、さらに実行するthenの構文を使用します。

damageTypesService.save(inspection2update.ObjectTypeId, self.dType).then(function(data) { 
    inspection2update.DamageTypeId = data; 
    // rest of execution... 
}); 

PS - 私の知る限り見ることができるようにあなたのケースで$qのない使用はありません(あなたがデータと交流したい場合を除き/ログを作るなど)。であるとして、あなたが$httpコールを返すことができます。

function save(objectTypeId, damageDescription) { 
    return $http.post(serviceAddress + "save/" + objectTypeId + "/" + damageDescription); 
} 
2

.then機能

damageTypesService.save(inspection2update.ObjectTypeId, self.dType).then(function(response){ 
    /*use the response here 
    eg: inspection2update.DamageTypeId = response.id 
    */ 
    }) 
+0

あなたのdeferred.resolved(data)のポイントは何ですか?コールバックが発生すると、データはすでに解決されます。 –

2

まずオフ$q

function save (objectTypeId, damageDescription) { 
    var deferred = $q.defer(); 

    $http({ 
    url: serviceAddress + "save/" + objectTypeId + "/" , 
    method: 'POST', 
    data: damageDescription 
    }) 
    .success(function (data) { 
    deferred.resolve(data); 
    }) 
    .error(function (data) { 
    deferred.resolve(data); 
    }); 

    return deferred.promise; 
} 

でそして、あなたのコントローラの使用中の角度promiseの最高を使用し、あなたが持っていますあなたのサービスメソッドはpostで、あなたはsaveというメソッドを呼び出しています。それは間違いですか?第二に、$httpサービスを使用する必要がある理由は何も見当たりません。サービスレベルは低く、リクエストは簡単です。あなたはチェックアウトする必要があります$resourceそれは抽象化のより高いレベルを提供し、あなたのような簡単な要求のために動作します。今、あなたの問題に。 $http$resourceは常に約束を返します。したがって、通常、サービスまたはコントローラでは、要求から受け取った応答を取得して処理するコールバックを提供します。 $ resourceと$httpのアプローチは似ていますが、$httpについて質問したところ、$httpを使用して説明します。

function post(objectTypeId, damageDescription) { 
return $http.post(serviceAddress + "save/" + objectTypeId + "/" + damageDescription); 
} 

は今、あなたのコントローラであなたは、サービスメソッドこのようなpost()を呼び出します。

damageTypesService.post(inspection2update.ObjectTypeId, self.dType).then(mycallback); 


function myCallback(response){ 
    inspection2update.DamageTypeId = response; // DamageTypeId now won't be populated until the request is resolved. 
} 
+0

私はgetのために私の例でそれを使用しようとし、それはdosentの仕事です – Michael

+0

これらの変更であなたの例のコードを提供してください。 "それは意味がない"と説明してください。あなたはどんなエラーを受けていますか? –

関連する問題