【问题标题】:return value from nested $.get嵌套 $.get 的返回值
【发布时间】:2013-02-04 18:51:05
【问题描述】:

我需要对几个不同的 php 脚本运行多个 $.get 函数,我想知道我是否可以在一个通用函数中完成所有这些并只返回数据。我的计划是:

var companyName = 'Google';

var customers = get('Customers', companyName);
var vendors = get('Vendors', companyName);

function get(table, variable){
    $.get('http://www.mysite.com/phps/get'+table+'.php', {company: variable}, function(data){return data});
}

但是,这不起作用,因为它位于嵌套函数中。这可能(很容易)还是我必须一次完成 $.get 一个?

【问题讨论】:

  • 异步代码要求您将代码带到结果中,而不是将结果返回给代码。
  • 不起作用是什么意思?
  • 在您的控制台中显示一些 javascript 错误? $.get() 已定义?引用@Mike Brant:“你说它不起作用是什么意思?”

标签: javascript jquery nested-function


【解决方案1】:

请记住,在 Javascript 中,函数是一等公民,因此您最好发送一个函数,而不是返回一个值:

var companyName = 'Google';

var customers, vendors;

get('Customers', companyName, function(data) { customers = data; });
get('Vendors', companyName, function(data) { vendors = data; });

function get(table, variable, success){
    $.get('http://www.mysite.com/phps/get'+table+'.php', {company: variable}, success);
}

这是一个糟糕的示例,因为它不处理异常等。但它应该让您了解提供给您的灵活性。关键是要记住,函数是语言的基石,也是赋予它强大的力量。

如果你真的想坚持你正在使用的方法(我不推荐),你可以添加一个额外的功能...... (我真的不推荐)

var companyName = 'Google';

var customers, vendors;

get('Customers', companyName, customers);
get('Vendors', companyName, vendors);

function get(table, variable, results){
    $.get('http://www.mysite.com/phps/get'+table+'.php', {company: variable}, function(data){ results = data});
}

这样做会导致您无法根据通话结果更改体验处理方式。也许您希望禁用一个选择框,直到呼叫完成并填充它,或者您希望在呼叫失败时执行一些特殊操作。使用函数是更好的方法。

希望这会有所帮助。

【讨论】:

  • 这很完美!正是我想要的。谢谢。
  • 你的第二个例子真的没有意义。 JavaScript 没有可以取消引用的指针,所以当你传递customersvendors 时,你实际上只是传递了当前值undefined。回调中的赋值发生在本地results 变量(parameter) 上。第一个例子稍微好一点,但仍然不是一个人会做的事情,因为对这些变量的赋值可能会在本地代码尝试使用变量之后很长时间发生。如果您的回调只是直接使用data 而不是执行分配,那就更清楚了。
【解决方案2】:

如果您使用的是 jquery 1.5,$.get 将返回一个 jqXhr 对象,该对象实现了 Promise 接口:

从 jQuery 1.5 开始,所有 jQuery 的 Ajax 方法都返回 XMLHTTPRequest 对象的超集。这个由 $.get() 返回的 jQuery XHR 对象或“jqXHR”实现了 Promise 接口,为它提供了 Promise 的所有属性、方法和行为

可以这样使用:

function yourMultipleGetFunction(success, error) {

    var jqXhr1 = $.get('url', data);
    var jqXhr2 = $.get('url2', data2);

    $.when(jqXhr1, jqXhr2).then(success, error);
}

yourMultipleGetFunction(function(data1, data2){
     //handle the objects returned from the get requests
}, function(jqXHR, textStatus, errorThrown){
    //something went wrong, handle the error here
});

【讨论】:

  • 我不确定这是否适合我。我展示的代码非常简化。实际上,我有大约 40 个不同的函数需要使用相同的 get 函数,将几个变量传递给该函数。目前,每个函数都只有自己的 .get,我只是想知道拥有一个他们都可以使用的 get 函数是否会更容易。看起来这样做会做更多的工作。
  • @TylerMortensen 如果您没有测试它是否有效,那么您怎么能说它不起作用?正如function get (table, variable) {...}); 中显示的那样,可能会起作用,但这取决于你是否开始意识到一些事情。
  • 如果您不需要对 AJAX 数据进行任何特定的解析,那么您最好使用 Promise;当它们都满足时(你会知道$.when,@Johan 指出),你可以继续你的应用逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
相关资源
最近更新 更多