Javascript 返回Json.Stringfy结果

Javascript 返回Json.Stringfy结果,javascript,jquery,json,datatables,stringify,Javascript,Jquery,Json,Datatables,Stringify,我有一段代码: $.getJSON('http://myjsonurl', function(json){console.log(JSON.stringify(json.columns)); }); 这将在控制台中返回json响应所需的全部内容。我的目标是把这个值放到一个函数中,这样我就可以在另一个地方调用它。(例如: "columns" : getColumns(); 所以我做了一个这样的函数: function getColumns() { $.getJSON('http://m

我有一段代码:

$.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响应重新初始化数据表,该响应包含数据和列(datatables本机不支持这一点)。该代码将使用新的查询参数重新加载该表,并包括按钮插件:

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();
            }
        };
    }();
您的
getColumns()
函数需要返回变量,此时该变量只返回到函数,而没有返回。请尝试以下操作: {

您的
getColumns()
函数需要返回变量,此时该变量只返回到函数,而没有返回。请尝试以下操作: {


正如@MiguelBolan所指出的,从
getColmuns()
return
$.getJSON()
getColumns()
返回值;用于访问异步函数返回的值

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)
}; 

正如@MiguelBolan所指出的,从
getColmuns()
return
$.getJSON()
getColumns()
返回值;用于访问异步函数返回的值

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)
}; 

@guest271314的回答是正确的,应该可以指导您解决有关从
getColumns
方法返回未定义列的问题

我只想在这里指出一些关键的事情

首先研究一下我刚才创建的对象。正如您所看到的,这里的所有功能都是操作延迟对象(有关更多信息,请参阅).Rougly解释说,延迟对象可以注册回调,如果您喜欢多个回调,可以链接它们,通过调用它们可以广播它们的状态以及它们的响应。它基于Promissions设计,因此此类方法返回可以解析的承诺,同步或异步(大多数情况下,承诺在异步操作中很有用)

jQuery的异步方法,如
$.ajax
返回一个承诺。
$.getJSON
也不例外,因为它最终调用
$.ajax
,正如前面提到的,它返回jQuery延迟承诺

有关jQuery的
动画
方法,请参见下面的@guest271314注释

更多关于承诺

从文件:

当绑定到集合的特定类型的所有操作(排队与否)完成时,返回要观察的承诺对象

处理时,
promise
表示已解决或已拒绝
resolve
表示成功响应,正如
拒绝
表示失败一样。 从文档中我们可以看到,有一些方法可以处理成功、失败或两者兼而有之的
Deferred
object

deferred.done()添加在调用延迟对象时要调用的处理程序 决心

deferred.fail()添加拒绝延迟对象时要调用的处理程序

deferred.always()添加在解析或拒绝延迟对象时要调用的处理程序

那么,让我们回到OP的问题。正如您现在从代码中看到的:

function getColumns() {
    $.getJSON('http://myjsonurl', function(json){return JSON.stringify(json.columns); });
}
您无法知道
getColumns
状态,因为您不返回
promise
。当使用
$时。getJSON
处理程序基本上在那里处理响应而不发出promise对象。
getColumns
函数当然返回
未定义的
,因为没有ign of
return
,默认情况下您会得到它

关于
deferred.then()
方法,使用此方法,您还可以处理承诺,处理其状态及其进度。在我上面发布的Plunker中的示例代码中,我不关心进度,只关心状态,因此在第一个示例中,承诺是用
处理的。然后()
方法,第一个函数是成功处理程序,第二个函数是失败处理程序。从它们返回响应基本上意味着承诺得到解决。我也返回承诺本身


在注释掉的部分中,您可以看到,如果您愿意,您只能返回承诺,并在
始终
方法中解决响应问题@guest271314答案是正确的,应该可以指导您解决从
getColumns
方法返回未定义的问题

我只想在这里指出一些关键的事情

首先研究一下我刚才创建的对象。正如您所看到的,这里的所有功能都是操作延迟对象(有关更多信息,请参阅).Rougly解释说,延迟对象可以注册回调,如果您喜欢多个回调,可以链接它们,通过调用它们可以广播它们的状态以及它们的响应。它基于Promissions设计,因此此类方法返回可以解析的承诺,同步或异步(大多数情况下,承诺在异步操作中很有用)

jQuery的异步方法,如
$.ajax
返回一个承诺。
$.getJSON
也不例外,因为它最终调用
$.ajax
,正如前面提到的,它返回jQuery延迟承诺

有关jQuery的
动画
方法,请参见下面的@guest271314注释

更多关于承诺

从文件:

当绑定到集合的特定类型的所有操作(排队与否)完成时,返回要观察的承诺对象

处理时,
promise
表示已解决或已拒绝
resolve
表示成功响应,正如
拒绝
表示失败一样。 从文档中我们可以看到,有一些方法可以处理成功、失败或两者兼而有之的
Deferred
object

延迟。完成()