返回Json.Stringfy结果
我有这段代码:
$.getJSON('http://myjsonurl', function(json){console.log(JSON.stringify(json.columns)); });
这将从我的json响应中返回控制台中所需的全部内容。 我的目标是将这个值转换为函数,以便我可以在另一个地方调用它。 (例如 :
"columns" : getColumns();
所以我正在制作这样的函数:
function getColumns() { $.getJSON('http://myjsonurl', function(json){return JSON.stringify(json.columns); }); } console.log(getColumns()); // and then call the function in the console log expecting to see the same result as before.
但我得到的只是未定义。 为什么?
更新:
这就是我实现我想要的方式。 以下代码将基于具有数据和列的json响应重新启动数据表(本地不支持数据表的内容)。 代码将使用新的查询参数重新加载表,并包含按钮插件:
var theurl; theurl = "http://myjson.json"; function updateQueryStringParameternondt(key, value) { var table = $('#datatable-buttons').DataTable(); var ajaxurl = theurl; var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i"); var separator = ajaxurl.indexOf('?') !== -1 ? "&" : "?"; if (ajaxurl.match(re)) { console.log( ajaxurl.replace(re, '$1' + key + "=" + value + '$2')); theurl = ajaxurl.replace(re, '$1' + key + "=" + value + '$2'); table.destroy(); TableManageButtons.init(); } else { console.log( ajaxurl + separator + key + "=" + value); theurl = ajaxurl + separator + key + "=" + value ; table.destroy(); TableManageButtons.init(); } } TableManageButtons.init(); var handleDataTableButtons = function() { 0 !== $("#datatable-buttons").length && $.ajax( { url:theurl, dataType: 'json', success: function ( json ) { $("#datatable-buttons").DataTable({ "data" : json.data, "columns": json.columns, dom: "Bfrtip", buttons: [{ extend: "copy", className: "btn-sm" }, { extend: "csv", className: "btn-sm" }, { extend: "excel", className: "btn-sm" }, { extend: "pdf", className: "btn-sm" }, { extend: "print", className: "btn-sm" }], responsive: !0 }); } } ); }, TableManageButtons = function() { "use strict"; return { init: function() { handleDataTableButtons(); } }; }();
@ guest271314答案是正确的,应该指导您解决有关从getColumns
方法返回undefined的问题。
我只想在这里指出一些关键的事情。
首先调查我刚刚创建的插件 。 正如您所看到的,这里的所有果汁都是操纵Deferred对象(有关详细信息 ,请参阅此处 )。 Rougly解释说,Deferred对象可以注册回调,如果你喜欢多个,可以链接它们,通过调用它们可以广播它们的状态以及它们的响应。 它基于promises设计,因此这些方法返回一个可以解析,同步或异步的promise(大多数时候promises在异步操作中很有用)。
jQuery的异步方法,如$.ajax
返回一个promise。 $.getJSON
没有什么不同,因为它最后会调用$.ajax
,如上所述返回一个jQuery Deferred Promise。
有关jQuery的animation
方法,请参阅下面的@ guest271314评论。
更多关于承诺在这里 。
从文档 :
返回一个Promise对象,以观察绑定到已排队或未排队的某个类型的所有操作是否已完成。
处理时的promise
要么已解决,要么被拒绝 。 resolve
代表成功的反应,因为reject
代表失败。 从文档中我们可以看到有Deferred
对象的方法来处理成功,失败或两者。
deferred.done()添加在解析Deferred对象时要调用的处理程序。
deferred.fail()添加在拒绝Deferred对象时要调用的处理程序。
deferred.always()添加要在解析或拒绝Deferred对象时调用的处理程序。
那么,让我们回到OP的问题。 正如您现在可以从代码中看到的那样:
function getColumns() { $.getJSON('http://myjsonurl', function(json){return JSON.stringify(json.columns); }); }
您无法知道getColumns
状态,因为您没有返回promise
。 使用$.getJSON
处理程序时,您基本上处理响应,而不会发出promise对象。 getColumns
函数当然返回undefined
因为没有return
迹象,默认情况下你会得到它。
关于deferred.then()
方法,使用它可以处理一个promise,处理它的状态及其进度。 在我在上面发布的Plunker示例代码中,我不关心进度,只关心状态,所以在第一个例子中,使用.then()
方法处理promise,第一个函数是成功处理程序,第二个函数是失败处理程序。 从他们那里回复回应本质上意味着承诺得到解决。 我也回复了承诺。
在注释掉的部分中,您可以看到,如果您愿意,可以仅返回promise,并在always
方法中解析响应
正如@MiguelBolan所指出的, getColmuns()
没有返回任何值。 从getColumns()
return
$.getJSON()
getColumns()
; 使用.then()
来访问从异步函数返回的值
function getColumns() { return $.getJSON("http://myjsonurl"); } getColumns().then(function(json) { console.log(JSON.stringify(json.columns)) } // handle errors , function err(jqxhr, textStatus, errorThrown) { console.log(textStatus, errorThrown) };
你的getColumns()
函数需要返回变量,此时它只返回到函数但没有输出。 试试这个: {
function getColumns() { var ret; $.getJSON('http://myjsonurl', function(json){ ret = JSON.stringify(json.columns); }); return ret; }