使用Jquery进行同步“Ajax”调用似乎不起作用

时间:2016-01-18 14:09:02

标签: javascript jquery ajax flux

我是javascript的新手,我正在建立一个react / flux应用程序并使用jquery对后端进行同步“ajax”调用(sjax?)。我得到了不一致的行为,因为(我认为)尽管使用async:false,我的ajax调用仍然没有阻塞。关键代码剪辑如下。

执行流程在带有ActionTypes.LOGIN案例的Flux商店中开始,然后移至fetchAccount(action.value);,并且应该同步跟随AppStore.emitChange();

问题是如果我调用AppStore.emitChange();在我的$ .ajax成功函数中,我能够保证AppStore.emitChange();在成功函数之后,但是如果AppStore.emitChange()在fetchAccount(action.value)调用之后,它将在$ .ajax成功函数完成之前执行。

在我的Flux商店中,我调用辅助函数然后发出更改:

// Register callback to handle all updates
AppDispatcher.register(function(action) {
  var text;

  switch(action.actionType) {
    case ActionTypes.LOGIN:
      fetchAccount(action.value);
      //if i put AppStore.emitChange(); here it's invoked 
      //before fetchAccount completes even though the $.ajax call is async: false
      AppStore.emitChange();
      break;

   //... code ommitted ...
  }
});

我的帮助函数执行ajax调用:

function fetchAccount(email) {
  $.ajax({
    url: "http://www.foo.com/api/accounts/" + email,
    jsonp: "callback",
    dataType: 'jsonp',
    type: 'GET',
    async: false,
    headers: {"Accept" : "application/javascript; charset=utf-8"},
    success: function(data) {
      user = data;
      currentViewState = AppStates.CONTENT_VIEW;
      //AppStore.emitChange(); ---> if i emitChange here it works
    },
    error: function(xhr, status, err) {
      user = "";
      currentViewState = AppStates.LOGIN_VIEW;

    }    
  });
};

1 个答案:

答案 0 :(得分:1)

跨域请求和dataType:" jsonp"请求不支持同步操作。见http://api.jquery.com/jquery.ajax/