【问题标题】:jQuery $.ajax(), pass success data into separate functionjQuery $.ajax(),将成功数据传递给单独的函数
【发布时间】:2011-01-25 02:19:17
【问题描述】:

我正在使用 jQuery $.ajax() 函数。我已将其放入父函数中,该函数将一些值传递给 ajax 函数。我想做的是有一个用户定义的回调函数,它获取从ajax成功函数传入的数据参数。

这是我认为可行的方法,但事实并非如此:

testFunc = function(str, callback) {
    // Send our params
    var data = 'some data to send';
    $.ajax({
        type: 'POST',
        url: 'http://www.myurl.com',
        data: data,
        success: callback
    });
}

然后我希望能够调用该函数,并传入我的自定义函数,以便我可以使用该函数内部的成功函数数据:

testFunc('my string data', function(data){
    alert(data);
});

我希望这与以下内容相同:

testFunc = function(str, callback) {
    // Send our params
    var data = 'some data to send';
    $.ajax({
        type: 'POST',
        url: 'http://www.myurl.com',
        data: data,
        success: function(data) {
            alert(data);
        }
    });
}

【问题讨论】:

  • 你确定你获得了“成功”吗?
  • 是的,我正在通过“成功”获取一些数据。

标签: javascript jquery ajax callback


【解决方案1】:

对我来说很好用:

<script src="/jquery.js"></script>
<script>
var callback = function(data, textStatus, xhr)
{
    alert(data + "\t" + textStatus);
}

var test = function(str, cb) {
    var data = 'Input values';
    $.ajax({
        type: 'post',
        url: 'http://www.mydomain.com/ajaxscript',
        data: data,
        success: cb
    });
}
test('Hello, world', callback);
</script>

【讨论】:

  • 不知道我错过了什么,但按照你的例子,它工作得很好。谢谢!
【解决方案2】:

您可以使用 this 关键字访问自定义数据,传递给 $.ajax() 函数:

    $.ajax({
        // ... // --> put ajax configuration parameters here
        yourCustomData: {param1: 'any value', time: '1h24'},  // put your custom key/value pair here
        success: successHandler
    });

    function successHandler(data, textStatus, jqXHR) {
        alert(this.yourCustomData.param1);  // shows "any value"
        console.log(this.yourCustomData.time);
    }

【讨论】:

  • 这是一个不错的、干净的方法,它不涉及创建新函数。谢谢!
【解决方案3】:

我就是这样做的

function run_ajax(obj) {
    $.ajax({
        type:"POST",
        url: prefix,
        data: obj.pdata,
        dataType: 'json',
        error: function(data) {
            //do error stuff
        },
        success: function(data) {

            if(obj.func){
                obj.func(data); 
            }

        }
    });
}

alert_func(data){
    //do what you want with data
}

var obj= {};
obj.pdata = {sumbit:"somevalue"}; // post variable data
obj.func = alert_func;
run_ajax(obj);

【讨论】:

  • 我敢肯定,对于一个简单的用例,您不会像那样单独声明对象属性,为什么不使用对象文字呢? {"pdata":{"submit":"somevalue"},"func":alert_func}请问这对JS中的GC有什么影响(如果有的话)?
【解决方案4】:

在第一个代码块中,您永远不会使用str 参数。您的意思是说以下内容吗?

testFunc = function(str, callback) {
    $.ajax({
        type: 'POST',
        url: 'http://www.myurl.com',
        data: str,
        success: callback
    });
}

【讨论】:

    【解决方案5】:

    我相信你的问题是你传递 testFunct 一个字符串,而不是一个函数对象,(这甚至可能吗?)

    【讨论】:

      【解决方案6】:

      虽然我不能 100% 确定您想要什么(可能我今天的大脑很慢),但这里有一个与您描述的类似用途的示例:

      function GetProcedureById(procedureId)
      {
          var includeMaster = true;
          pString = '{"procedureId":"' + procedureId.toString() + '","includeMaster":"' + includeMaster.toString() + '"}';
          $.ajax({
              type: "POST",
              contentType: "application/json; charset=utf-8",
              data: pString,
              datatype: "json",
              dataFilter: function(data)
              {
                  var msg;
                  if (typeof (JSON) !== 'undefined' &&
                          typeof (JSON.parse) === 'function')
                      msg = JSON.parse(data);
                  else
                      msg = eval('(' + data + ')');
                  if (msg.hasOwnProperty('d'))
                      return msg.d;
                  else
                      return msg;
              },
              url: "webservice/ProcedureCodesService.asmx/GetProcedureById",
              success: function(msg)
              {
                  LoadProcedure(msg);
              },
              failure: function(msg)
              {
                  // $("#sometextplace").text("Procedure did not load");
              }
          });
      };
      /* build the Procedure option list */
      function LoadProcedure(jdata)
      {
          if (jdata.length < 10)
          {
              $("select#cptIcdProcedureSelect").attr('size', jdata.length);
          }
          else
          {
              $("select#cptIcdProcedureSelect").attr('size', '10');
          };
          var options = '';
          for (var i = 0; i < jdata.length; i++)
          {
              options += '<option value="' + jdata[i].Description + '">' + jdata[i].Description + ' (' + jdata[i].ProcedureCode + ')' + '</option>';
          };
          $("select#cptIcdProcedureSelect").html(options);
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-01
        相关资源
        最近更新 更多