JQuery使用Ajax延迟函数的结果

时间:2015-03-12 20:25:03

标签: jquery deferred

我需要根据ajax调用的结果从函数返回一个值。我的问题是我无法更改被调用的方法(getHtml),因为它来自第三方,我无法控制该代码。

所以我需要使用getHtml函数以某种方式在ajax调用完成后返回结果。

我尝试了很多东西,包括以下内容。但它不起作用,因为它只是立即返回getOptions。

如果我无法控制如何调用getHtml,我无法弄清楚如何使用回调来执行此操作。

    ...

    // I need to use this getHtml function
    getHtml: function() {

        var that = this;

        var id = this.id;

        return this.getOptions(id).then(function(options) {

             // I want to return this from the getHtml function
             // after options have been retrieved via ajax:

             return that.template(options); 
        }

    },


    getOptions: function(id)
    {
        return $.post( 
                  myurl, 
                  {
                    action: '/myaction', 
                    data: {id:id} 
                  } 
        );

     }, 

    ...

1 个答案:

答案 0 :(得分:0)

您的getHtml()函数是异步的,因为它调用了一个调用$.post()来完成其工作的函数。因此,getHtml()在获得结果之前返回。因此,它无法返回结果。 Javascript中没有神奇的技巧来处理异步任务,并以某种方式使其同步,以便您可以从getHtml()返回结果。你不能。

相反,您必须使用异步机制来传递返回结果。由于你已经在使用promises和jQuery ajax函数已经支持promises,这是合乎逻辑的方式。

但是,getHtml()的来电者必须改变。如果没有切换到完全不推荐的同步Ajax,就无法让getHtml()直接返回结果。

你已经有了合适的脚手架。 getHtml()的调用者只需要使用返回的promise,如下所示:

obj.getHtml().then(function(result) {
    // process result here
});

这里唯一的两个选择是停止在getHtml()中的任何位置使用任何异步操作,这样它就可以直接返回结果(如果你在该函数中需要Ajax,那么你必须切换到非同步的Ajax建议使用)或更改调用getHtml()的方式,以便它可以通过某种回调返回结果(推荐是一种推荐方式)。这是解决这个问题的两个主要途径。