2017-10-26 19 views
0

私は約束とJavaのコールバックの新機能です。私のプロジェクトでは、getJSONを使用して情報を取得し、それをコントローラで使用しようとしています。ここで私はこれまで持っているものです。コールバックはAngularjsで動作しませんか?

vm.addStop = function() { 
    vm.isBusy = false; 
    var result; 
    try { 
     vm.getCoords(vm.newStop.name, function (result) { 
      console.log("Trying to use this callback: "); 
      console.log(result); 
      // callback worked? continue from here 
      var newStop = sqlFactory.addStop(vm.newStop.name, result.lat, result.lng, vm.newStop.stopDate, vm.tripNum); 
      vm.stops.push({ 
       id: parseInt(newStop.id), 
       name: String(newStop.name), 
       latitude: result.lat, 
       longitude: result.lng, 
       stopDate: new Date(vm.newStop.stopDate), 
       tripNum: parseInt(newStop.tripNum) 
      }); 
     }); 
    } 
    catch (err) { 
     vm.isBusy = false; 
     vm.errorMessage = "Error saving stop: " + err; 
    } 
}; 

vm.getCoords = function (name, callback) { 
    var location = name; 
    var result = ""; 
    location = location.replace(" ", "+"); 
    var url = "https://maps.googleapis.com/maps/api/geocode/json?address=" + location + "&key=key"; 

    $.getJSON(url) 
     .done(function (data) { 
      result = { 
       lat: data.results[0].geometry.location.lat, 
       lng: data.results[0].geometry.location.lng 
      }; 
      callback(result); 
     }) 
     .fail(function (err) { 
      result = "error"; 
     }); 
}; 

私の問題は、私は、コールバックからのデータを使用してvm.stopsにプッシュしようとしているとき、実際にすべての方法を実行していないようだということですスルー。私のsqlFactory.addStop関数の後で一時停止しているようです。ページをリフレッシュすると、pushの直前にsqlFactory関数を使ってデータベースに正しく保存したことが示されます。しかし、データバインドプッシュ自体はブラウザには表示されません。

これはまだ全体的に非同期的な機能なので、これを想定していますか?プッシュが正しく機能するようにするためのメソッドがありますか、終了した後にgetJSONコールからデータを正しく取得する方法はありますか?あるいは単にページリフレッシュ機能ですか?

+0

ユーザー[$ HTTP](https://docs.angularjs.org/api/ng/service/$http)サービスを使用してみてください。あなたの 'sqlFactory.addStop()'関数が非同期の場合、関数から約束を返し、 'vm.stops'に値を代入する必要があります。 –

答えて

0

は、Webサービスを呼び出すために$ qをプロバイダに

vm.getCoords(vm.newStop.name, function (result) { 
    console.log("Trying to use this callback: "); 
    console.log(result); 
    // callback worked? continue from here 
    $q.all(sqlFactory.addStop(vm.newStop.name, result.lat, result.lng, vm.newStop.stopDate, vm.tripNum)) 
    .then(function (result) { 
     var newStop = result[0]; 
     vm.stops.push({ 
      id: parseInt(newStop.id), 
      name: String(newStop.name), 
      latitude: result.lat, 
      longitude: result.lng, 
      stopDate: new Date(vm.newStop.stopDate), 
      tripNum: parseInt(newStop.tripNum) 
     }); 
    }); 

}); 
関連する問題