从函数返回两个或多个值

时间:2010-04-08 18:31:54

标签: jquery coldfusion

我需要从ajax回调函数中的ColdFusion函数返回多个值。这就是我所拥有的:

$('input[name="StateName"]').live('change', function() {
    var StateID = $(this).parents('tr').attr('id');
    var StateName = $(this).val();
    $.ajax({
        url: 'Remote/State.cfc'
        ,type: "POST"
        ,data: {
            'method': 'UpdateStateName'
            ,'StateID': StateID
            ,'StateName': StateName
        }
        ,success: function(result){
            if (isNaN(result)) {
                $('#msg').text(result).addClass('err');
            } else {
                $('#' + result + ' input[name="StateName"]').addClass('changed');
            };
        }
        ,error: function(msg){
            $('#msg').text('Connection error').addClass('err');
        }
    });
});

如果我捕获数据库错误,则触发成功回调,结果为非数字(实际上是错误消息的文本)。我需要该函数也传回其他值。一个可能是导致错误的行的主键。另一个可能是旧的StateName,因此我可以刷新屏幕上的旧值,以便客户端完全知道他们的更改没有生效。

我想我在这里违反了原子性规则,需要解决这个问题,因为我使用结果作为更新行的主键,或者如果更新失败则是错误消息。我需要返回主键和错误消息。

3 个答案:

答案 0 :(得分:6)

我想你的远程功能可以返回一个**JSON 字符串**,包含一个对象。

它允许您在单个“值”中包含多个值。

JSON是Javascript Object Notation,它很容易在Javascript中读取 - 并且有很多库可以用多种语言将数据序列化为JSON。


例如,这是一个JSON字符串:

{"status":1,"message":"this is a message","data":{"test":"plop","hello":"world"}}

这对应于具有3个属性的对象:

  • status
  • message
  • data;它本身就是另一个对象,它包含两个属性。

从你的AJax调用中返回这种字符串应该不会太难 - 而且这是一个非常灵活,非常强大的系统。

答案 1 :(得分:4)

我让所有的ajax请求返回相同的对象类型。我使用的模式非常常见 - 我的响应对象总是由Success标志,Data属性和Errors集合组成。

如果您将这样的对象jsonify并为所有ajax请求返回它,您可以始终确定请求是否成功,错误是什么(如果有的话),如果成功,您将得到结果数据。通过这种方式,您将始终能够以一致的方式处理您的回复。

请注意,Errors集合将是业务逻辑错误 - 实际服务器错误仍会触发jQuery失败处理程序。但是使用上面的对象,你的“成功”功能看起来更像是:

 if (!result.Success) {
    $('#msg').text(result.Errors[0]).addClass('err');
 } else {
    $('#' + result.Data + ' input[name="StateName"]').addClass('changed');
 };

答案 2 :(得分:1)

您可以返回xml字符串,然后在成功函数中访问它:

success:function(data)
{
  var err_code,err_msg;
  //read err_code and err_msg:
  // we need 2 different handlers for IE and all other browsers.
            if (! $.browser.msie) 
            {
                // this code surprisingly doesn't work with IE.
                err_code = $('error_code:first',data).text();
                err_msg = $('error_message:first',data).text();
            }
            else
            {
                var xml = new ActiveXObject("Microsoft.XMLDOM");
                xml.async = false;
                xml.loadXML(data);
                err_code = xml.documentElement.getElementsByTagName('error_code')[0].text;                    
                err_msg = xml.documentElement.getElementsByTagName('error_message')[0].text;
            }

}