2017-06-06 17 views
0
$(function() { 
     //hard coded for initial debugging usage, must add table to reference 
     var userPermissionLevelRequired = 31; 
     var currentUserDescription = $('.user-menu .hidden-xs').html(); //to get user description 
     var userList = null; 
     var table = null; 
     var userName = $.grep(userDetail, function (item) { 
      return item.Description === currentUserDescription; 
     }); 

     getUserMembers(); 

     /*$.ajax({ 

      'url': '/Home/GetUserMembers', 
      'type': 'GET', 
      dataType: "json", 
      'success': function (data) { 
       userList = data; 
       populateDropDown(data); 
       debugger; 
      }, 
      'error': function (request, error) { 
       alert("Request: " + JSON.stringify(request)); 
      } 
     });*/ 

     function setPermission() { 
      //do something... 
     } 
     function getUserMembers() { 
      $.ajax({ 

       'url': '/Home/GetUserMembers', 
       'type': 'GET', 
       'dataType': 'json', 
       'async':'false', 
       'success': function (data) { 
        userList = data; 
        populateDropDown(data); 
        debugger; 
        //alert("data.length " + data.length); 
        setPermission(); 
       }, 
       'error': function (request, error) { 
        alert("Request: " + JSON.stringify(request)); 
       } 
      }); 
     } 

コメントアウトされたajax呼び出しの後にコードを追加したかったのです。しかし、コードはajax呼び出しから戻る前にさらに実行されます。 ajax呼び出しの後にsetPermissionを実行する唯一の方法は、呼び出しをajaxの成功関数に入れることでした。なぜ私はこれをしなければならなかったのですか?jQuery strange hoisting/initializing behavior

+2

「javascript」が非同期であるため、 –

+0

@Bhavik Patel - 本当に簡単です。このような状況に対処する他の方法はありますか?私がそれを受け入れることができるように答えを出してください –

答えて

1

実際に$ .ajax関数は、デフォルトではJavaScript自体ではなく非同期です。 async属性を使用すると、実際に動作を同期させることができます。

しかし、あなたは以下のように、引用符なしfalseを言及する必要があります。その場合の

$.ajax({ 

    'url': '/Home/GetUserMembers', 
    'type': 'GET', 
    'dataType': 'json', 
    'async': false, 
    'success': function (data) { 
     userList = data; 
     populateDropDown(data); 
     debugger; 
     //alert("data.length " + data.length); 
     setPermission(); 
    }, 
    'error': function (request, error) { 
     alert("Request: " + JSON.stringify(request)); 
    } 
}); 

を、$のアヤックスは、として同期呼び出しを振る舞うだろうし、あなたはその次の任意のステートメントを持つことができ、成功ブロックの中にsetPersmission()を呼び出す必要はありません。