我需要根据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}
}
);
},
...
答案 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()
的方式,以便它可以通过某种回调返回结果(推荐是一种推荐方式)。这是解决这个问题的两个主要途径。