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 结果(推荐的方式是承诺).这是解决此问题的两条主要途径。
我需要 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 结果(推荐的方式是承诺).这是解决此问题的两条主要途径。