JQuery 使用 Ajax 的函数的延迟结果

JQuery Deferred result of Function using Ajax

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

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

我尝试了很多方法,包括以下内容。但它不起作用,因为它只是立即 return 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} 
                  } 
        );

     }, 

    ...

您的 getHtml() 函数是异步的,因为它调用一个调用 $.post() 的函数来完成它的工作。因此,在获得结果之前 getHtml() returns。因此,它不能 return 结果。在 Javascript 中没有魔术可以接受一个异步任务并以某种方式使其同步,这样您就可以 return 来自 getHtml() 的结果。你不能。

相反,您必须使用异步机制来传达 return 结果。由于您已经在使用 promises 并且 jQuery ajax 函数已经支持 promises,所以这是合乎逻辑的方式。

但是,getHtml() 的调用者必须改变。除非切换到根本不推荐的同步 Ajax,否则无法直接使结果 getHtml() return。

您已经有了合适的脚手架。 getHtml() 的调用者只需要像这样使用 returned promise:

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

这里你只有两个选择是停止在 getHtml() 中的任何地方使用任何异步操作,这样它就可以 return 直接得到结果(如果你需要 Ajax 在那个函数中,那么你必须切换到完全不推荐的同步 Ajax 或更改 getHtml() 的调用方式,以便它可以通过某种回调 return 结果(推荐的方式是承诺).这是解决此问题的两条主要途径。