2016-04-15 70 views
0

我試圖哄騙JavaScript進入同步的行爲,但我迄今爲止失敗了。同步AJAX(違反諾言)

我試過30種或更多不同的方法,這裏是最新嘗試的基礎上,另外一個答案,在這裏StackOverflow

function fnc() { 
    $.ajax({ 
     type: 'GET', 
     url: "libraries/resources/data.json", 
     dataType: 'json', 
     success: function (data) { 
      ... 
      objSomething = { 
       ... 
      }; 
    }, 
     error: function() {} 
    }); 
} 
fnc().then(function(objSomething) { 
    google.maps.event.addDomListener(window, 'load', function(){ initialize(objSomething); }); 
}).catch(function(objSomething) { 
    ... 
}); 

不過,我得到一個錯誤:

TypeError: undefined is not an object (evaluating 'fnc().then')

我試過的大多數方法都會導致類似的錯誤。

至於Google Maps代碼,它確實有效(儘管並非總是如此,但由於代碼執行的異步性)。

值得注意的是,雖然我能夠從頭開始編寫複雜的代碼,但當談到底層機制時,我並不那麼熟練。

我使用的是jQuery 2.2.2,通過Google API CDN。

+4

你'fnc'功能不返回任何東西,所以你不能這樣做'FNC(),則()'... – Cristy

+0

@Cristy,根據我的例子。已經嘗試過,有些人有回覆聲明,有些沒有。我試過了一個return語句,但它不起作用。我希望你能看到一個例子 - 你認爲 - 應該起作用。 –

+0

@WayneSmallman \t「不起作用」不能提供足夠的信息進行診斷。如果一個函數沒有返回任何東西,你不能在其返回值上調用任何東西 - 如果你有一個示例建議,那麼這個例子是不正確的。 –

回答

3

這是您正在尋找的解決方案。

function fnc() { 
     var dfd = jQuery.Deferred(); 
     $.ajax({ 
      type: 'GET', 
      url: "libraries/resources/data.json", 
      dataType: 'json', 
      success: function (data) { 
       ... 
       objSomething = { 
        ... 
       }; 
      dfd.resolve(objSomething); 
     }, 
      error: function (error) { dfd.reject(error); } 
     }); 

     return dfd.promise(); 
    } 

    $.when(fnc()).then(function(objSomething) { 
     google.maps.event.addDomListener(window, 'load', function(){ 
      initialize(objSomething); 
     }); 
    }, function(error){ 
     //Handle Error 
    }); 
+0

@ p-janowski,謝謝! –

0

使用$.ajax功能可以使用then功能。請參考以下鏈接:

http://wildermuth.com/2013/8/3/JavaScript_Promises