从函数返回的访问数组 - javascript/jquery noob moment
Posted
技术标签:
【中文标题】从函数返回的访问数组 - javascript/jquery noob moment【英文标题】:Access array returned from a function - javascript/jquery noob moment 【发布时间】:2010-11-18 20:19:18 【问题描述】:当表单被提交时,我正在调用一个函数 getPosts 并传递一个变量 str。我想做的是获取从该函数返回的数据。
// when the form is submitted
$('form#getSome').submit(function()
var str = $("form#getSome").serialize();
var something = getPosts(str);
* This is where I'd like to get the data returned from getPosts()
return false;
);
// get the data
function getPosts(str)
$.getJSON('http://myurl.com/json?'+str+'&callback=?',
function(data)
arrPosts = new Array();
$.each(data.posts, function(i,posts)
// build array here
);
return arrPosts;
);
;
我尝试了很多东西,但只返回了“未定义”。我试过 console.log(something);, console.log(getPosts)。
我在这里遗漏了一些非常基本的东西。任何帮助将不胜感激。
编辑:
我想做的是创建一个可以获取帖子的函数。然后不同的事件会调用该函数。然后我可以使用这些数据。因此,一个事件可能是提交表单,另一个事件可能是单击链接,另一个是懒惰/无休止的滚动。所有人都可以使用相同的 getPosts 函数。
需要大量解析结果,这相当于很多行代码。只是想找到一种方法来重用该功能。你认为这可能吗?
$('a.thisLink').click(function()
getPosts();
get the return from getPosts() and do something with it
);
$('form.thisForm').submit(function()
getPosts();
get the return from getPosts() and do something with it
);
function getPosts()
get the posts and return an array
【问题讨论】:
【参考方案1】:Ajax 请求是异步执行的,getJSON 的回调函数(function (data)
)在请求结束时执行,在回调中返回一个值没有任何作用,因为 getPosts 内部是一个嵌套函数,它的返回值是 never用过。
实际上,在您的示例中,getPosts 不会返回任何内容,它会在返回数据之前结束其执行。
我建议你在提交事件处理程序上工作,如果你想保留 getPosts 函数,你可以引入一个回调参数:
$('form#getSome').submit(function()
var str = $("form#getSome").serialize();
getPosts(str, function (data)
var array = [];
$.each(data.posts, function(i,posts)
// build array here
array.push(/* value to add */);
);
// array ready to work with...
//...
);
return false;
);
function getPosts(str, callback)
$.getJSON('http://myurl.com/json?'+str+'&callback=?', callback);
编辑2:针对您的第二条评论,您可以进行另一个回调,该回调将在第一个回调处理完数据时执行,您可以在执行时定义它提交事件处理程序上的 getPosts 函数:
$('form#getSome').submit(function()
var str = $("form#getSome").serialize();
getPosts(str, reusableCallback, function (result)
// result contains the returned value of 'reusableCallback' <---
);
return false;
);
function reusableCallback(data)
var array = [];
$.each(data.posts, function(i,posts)
array.push(/* value to add */);
);
//...
return array;
function getPosts(str, callback, finishCallback)
$.getJSON('http://myurl.com/json?'+str+'&callback=?', function (data)
finishCallback(callback(data)); // pass the returned value
// of callback, to 'finishCallback' which is
// anonymously defined on the submit handler
);
编辑3:我认为getPosts
函数和“reusableCallback
”函数有很强的相关性,你可能想加入它们,让代码更易于使用和理解:
$('form#getSome').submit(function()
var str = $("form#getSome").serialize();
getPosts(str, function (result)
// result contains the processed results
);
return false;
);
function getPosts(str, finishCallback)
$.getJSON('http://myurl.com/json?'+str+'&callback=?', function (data)
// process the results here
var array = [];
$.each(data.posts, function(i,posts)
array.push(/* value to add */);
);
//...
finishCallback(array); // when the array is ready, execute the callback
);
【讨论】:
我认为这是在正确的轨道上。我试图做的是创建一个可以获取帖子的函数。然后不同的事件会得到帖子。因此,一个事件可能是提交表单,另一个事件可能是单击链接,另一个是惰性滚动。所有人都可以使用相同的 getPosts 函数。有很多解析结果,这相当于很多行代码。只是想找到一种方法来重用它。你认为这可能吗? 是的,这正是我正在寻找的,这样我就可以继续重用 reusableCallback 函数。最后一个问题,如何引用提交函数中返回的数据(从 reusableCallback 函数)? 非常感谢。这正是我需要的。现在我要去学习,以确保我理解为什么它完全有效。虽然我知道 jQuery 的许多细节,但正如您所见,我的 javascript 非常薄弱。再次感谢!【参考方案2】:您的 getPosts 函数看起来不完整,我不是 jquery 专家,但它应该看起来像:
function getPosts(str)
$.getJSON('http://myexample.com/json?'+str+'&callback=?',function(data)
var arrPosts = [];
$.each(data.posts, function(i,posts)
... build array yada yada ...
);
return arrPosts;
);
【讨论】:
【参考方案3】:问题是 $.getJSON 回调函数在 get 请求返回数据时被调用,而不是与您的函数内联。
【讨论】:
以上是关于从函数返回的访问数组 - javascript/jquery noob moment的主要内容,如果未能解决你的问题,请参考以下文章
从函数返回的访问数组 - javascript/jquery noob moment