Возвращение двух или больше значений от функции

Я должен возвратить несколько значений от функции ColdFusion в ajax функции обратного вызова. Вот то, что я имею:

$('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, так, чтобы я мог обновить старое значение на экране так, чтобы клиент знал абсолютно наверняка, что их изменение не вступило в силу.

Я предполагаю, что нарушаю правило атомарности здесь и потребности зафиксировать это, потому что я использую результат в качестве обоих первичный ключ строки, которая была обновлена, или это - сообщение об ошибке, если обновление перестало работать. Я должен возвратить и первичный ключ и сообщение об ошибке.

5
задан Phillip Senn 8 April 2010 в 18:31
поделиться

3 ответа

Ваша удаленная функция может вернуть ** строку JSON **, содержащую объект, я полагаю.

Это позволит вам иметь несколько значений внутри одного «значения».

JSON - это объектная нотация Javascript, его довольно легко прочитать в Javascript - и есть библиотеки для сериализации данных в JSON на многих языках.


Например, вот строка JSON:

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

Это соответствует объекту с 3 свойствами:

  • статус
  • сообщение
  • и данные ; который сам по себе является другим объектом, который содержит два свойства.

Возврат такой строки из вашего вызова AJax не должен быть слишком сложным - это довольно гибкая и действительно эффективная система.

6
ответ дан 13 December 2019 в 19:24
поделиться

Вы можете вернуть строку 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;
            }

}
1
ответ дан 13 December 2019 в 19:24
поделиться

Я заставляю все мои запросы 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');
 };
4
ответ дан 13 December 2019 в 19:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: