2017-12-30 60 views
0

を呼び出して、私はそれに接続されている4つの機能があるボタンがあります。ng-click時にジャバスクリプト/ angularjs機能の順序は

 <button type="button" data-dismiss="modal" data-toggle= "modal" href="#booking" class="btn btn-success" ng-click="createResource(); cancelFirstModal(); confirmNumberOfBooking(); showSecondModal(); " >Create Bookings</button> 

を、createResource()はその後、最初に呼ばれるようにconfirmNumberOfBookings()ですが、Safariで私のコンソール出力は、そうでないと言います:

console log

$scope.createResource = function() { 
     console.log('create is called'); 
     $http.post('/api/v1/resource', $scope.newResource).then(function (response) { 
      console.log('post is called'); 
     }); 
    }; 

    $scope.confirmNumberOfBooking = function(){ 
     //$scope.numberOfBookings = 3; 
     console.log('confirm is called'); 
     $scope.newResource.booking = [ 
      { 
       startDateTime: "datetime", 
       endDateTime: "datetime" 
      } 
     ]; 

     for(var i = 0; i < $scope.newResource.numberOfBookings; i++){ 
      $scope.newResource.booking.push({startDateTime: "datetime",endDateTime: "datetime"}); 
     } 
    }; 

は、私の質問は、なぜ$http.postは最後呼び出されるんですか?それはconfirmNumberOfBookings()の前に技術的に宣言されています。

答えて

0

コールの順番はコンソールでどのように報告され、出力されるかは関係ありません。

$ http.postはconsole.logの直後に呼び出されます( 'create is called')。

$ http.postは、リクエストが成功または失敗したときに応答オブジェクトに解決されるプロミスを返します。したがって、プロミスが解決され、コールの順番を示さない場合にのみ '投稿が呼び出されます'という出力が得られます。

まだわからない場合は教えてください。

+0

これは意味があります!約束が解決される前に 'confirmNumberOfBookings()'を呼び出す方法はありますか? – asus

+0

はい、ありますが、私の提案は、ng-click機能のオーダーでフローに依存するのではなく、ng-clickで1つの関数を呼び出して、その関数またはロジックのフローを制御することです。 例えば、ng-click = "bookingConfirmation" $ scope.bookingConfirmation =()=> {// createResourceコールはできるだけそれを約束して、約束が解決されたら2番目の関数を呼び出すなどの約束をします。 } –

+0

関数が同期関数か非同期関数かによっても異なります。もしそれらが同期関数であれば、呼び出された順序に頼ることができますが、それらが約束を使用していないと、前の関数呼び出しが解決されたときに次のステップだけを実行し、次の関数を呼び出すことができます。たとえば、このフィドルをチェックしてください。 http://jsfiddle.net/perdeepOsingh/bu0ooz6b/2/ –