2013-08-16 34 views
0

這裏的問題是我有一個函數使用ajax請求將值返回給myBookmarks變量。這個變量需要在JavaScript的剩餘部分(未顯示)執行之前分配。因此設置async:false會有訣竅,但在Firefox中,我得到:JavaScript,使用withCredentials返回在異步請求期間分配的值

在窗口上下文中,同步模式不再支持使用XMLHttpRequest的withCredentials屬性。

我一直在追求一個使用setTimeout的解決方案,但setTimeout中的匿名函數無法將書籤的值返回給上層函數。

所以問題是,如何暫停index()函數內的執行並將書籤的值返回到上層myBookmarks var而不使用async:false?

var myBookmarks = index(); 

function index() { 
    var bookmarks = false; 

    $.ajax({ 
     xhrFields: { 
      withCredentials: true 
     }, 
     crossDomain: true, 
     async: false, 
     url: BOOKMARKS_URL, 
     contentType: 'application/json', 
     dataType: 'json', 
     success: function(data){ 
      if (!data.errors) { 
       // INDEX SUCCESS 
       bookmarks = data; 
      } else { 
       // INDEX FAILURE 
      } 
     } 
    }); 

    return bookmarks; 
} 
+2

如果你不能讓一個同步請求,那麼有沒有辦法返回函數的響應。請參閱[如何從AJAX調用返回響應?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call)替代解決方案(您基本上必須重構您的代碼以使用回調/承諾)。 –

+0

歡迎來到** async **的精彩世界!你不能那樣做。 – SLaks

+0

謝謝@FelixKling。 – jerome

回答

1

如何索引()函數中暫停執行,並返回書籤的值返回到上一級myBookmarks變種,而無需使用異步:假

你不能。一種選擇是提供一個回調,並調用,當異步函數完成:

function index(successCallback) { 

    $.ajax({ 
     xhrFields: { 
      withCredentials: true 
     }, 
     crossDomain: true, 
     async: false, 
     url: BOOKMARKS_URL, 
     contentType: 'application/json', 
     dataType: 'json', 
     success: function(data){ 
      if (!data.errors) { 
       // INDEX SUCCESS 
       successCallback(data) 
      } else { 
       // INDEX FAILURE 
      } 
     } 
    }); 
} 

然後調用它像

index(function(bookmarks){ 
    // do something with bookmarks 
});