2016-04-15 59 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