繁体   English   中英

返回Json.Stringfy结果

[英]return Json.Stringfy result

我有这段代码:

$.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响应(数据表本身不支持的某些内容)重新初始化数据表。 该代码将使用新的查询参数重新加载表,并包括按钮plugin:

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

正如@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)
}; 

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

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

首先研究一下我刚才创建的小块 如您所见,这里所有的功能都是操纵Deferred对象(更多信息请参见此处 )。 粗略地解释一下,Deferred对象可以注册回调,如果您喜欢多个回调,可以将它们链接起来,并通过调用它们可以广播其状态和响应。 它基于promise设计,因此此类方法返回可以解析,同步或异步的promise(大多数情况下,promise在异步操作中很有用)。

jQuery的异步方法(如$.ajax返回承诺。 $.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中的示例代码中,我并不关心进度,仅关注状态,因此在第一个示例中,promise是使用.then()方法处理的.then()第一个函数是成功处理程序,第二个功能是失败处理程序。 从他们那里返回响应本质上意味着诺言得以解决。 我也要答应诺言。

在注释掉的部分中,您可以看到,只要愿意,您就只能返回诺言,并以always方法解析响应

您的getColumns()函数需要返回变量,此刻仅将其返回给函数,而不是返回。 尝试这个: {

function getColumns() {
    var ret;
    $.getJSON('http://myjsonurl', function(json){
          ret = JSON.stringify(json.columns); 
          });
    return ret;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM