无法将整个JSON对象返回给调用函数

时间:2016-01-25 16:24:49

标签: javascript jquery ajax

我是AJAX的新手,我需要找到一种方法将AJAX JSON响应返回给调用函数。有没有办法实现这一目标。 我的代码片段:

Python 2.7.10 (default, May 23 2015, 09:44:00) 
[MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys, os, msvcrt, ctypes 
>>> ctypes.cdll.msvcr90.wprintf(b'w\x00i\x00d\x00e\x00\n\x00') 
wide
5
>>> msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) 
16384
>>> ctypes.cdll.msvcr90.wprintf(b'w\x00i\x00d\x00e\x00\n\x00')
w i d e
 5

2 个答案:

答案 0 :(得分:1)

jQuery.ajax() performs asynchronous HTTP request。因此,您无法同步返回其响应(您的代码正在尝试这样做)。

如果请求成功,success(data, textStatus, jqXHR)处理程序将在某个时刻被调用(您不知道何时)。

以下是修改代码的一种方法:

function requestAjaxWebService(webServiceName, method, jsonData, callback) {
    $.ajax({
        url: webServiceName,
        type: method,
        data : jsonData,
        dataType: "json",
        success: function (data, textStatus, jqXHR) {
            callback(true, data); // some method that knows what to do with the data
        },
        error: function(jqXHR, textStatus, errorThrown){
            callback(false, errorThrown);
        }
    });
}

callback应该是对以下方法的引用:

function onData(isSuccess, dataOrError)
{
    if (isSuccess) {
        // do something with data
    } else {
        console.error(dataOrError);
    }
}

更新如果由于某种原因在回调中需要设置对象:

function onData(isSuccess, settings, jqXHR, errorThrown)
{
    if (isSuccess) {
        // do something with the data:
        // jqXHR.responseText or jqXHR.responseXML
    } else {
        // do something with error data:
        // errorThrown, jqXHR.status, jqXHR.statusText, jqXHR.statusCode()
    }
}

function requestAjaxWebService(webServiceName, method, jsonData, callback) {
    var settings = {
        url: webServiceName,
        type: method,
        data : jsonData,
        dataType: "json"
    };
    settings.success = function(data, textStatus, jqXHR){
        callback(true, settings, jqXHR);
    };
    settings.error = function(jqXHR, textStatus, errorThrown){
        callback(false, settings, jqXHR, errorThrown);
    };
    $.ajax(settings);
}

requestAjaxWebService("name", "POST", "json", onData);

你也可以使用jqxhr对象的.done().fail()回调代替settings对象中的回调,正如obiTheOne的答案所暗示的那样。它可能看起来更整洁,但在这里并不重要。

答案 1 :(得分:1)

jQuery.ajax是一个异步函数,所以通常它不会返回任何内容。

无论如何,您可以通过将async选项设置为false来将值返回到原始函数,但不建议这样做,因为同步请求将阻止其余代码的其余执行,直到返回响应为止。

function requestAjaxWebService(webServiceName, method, onSuccess, onFail) {
    var returnData;
        $.ajax({
            url: webServiceName,
            type: method,
            async: false,
            data : jsonData,
            dataType: "json",
            success: function (data) {
                returnData = data;
            },
            error: function(error){
                returnData = "Server error";
            }
        });
    }

看一下这个例子:jsbin sync ajax example

您应该使用回调(标准方式)来处理响应

function onSuccess (data) {
  console.log(data);
}

function onFail (error) {
  console.log('something went wrong');
}

function requestAjaxWebService(webServiceName, method, onSuccess, onFail) {
    $.ajax({
        url: webServiceName,
        type: method,
        data : jsonData,
        dataType: "json",
        success: onSuccess,
        error: onError
    });
}

或者你可以返回一个Promise(一种异步对象),它会在请求完成后立即改变值

function requestPromise (webServiceName, method) {
    return $.ajax({
        url: webServiceName,
        type: method,
        data : jsonData,
        dataType: "json"
    });
}

requestPromise('...', 'GET').done(function (data) {
    console.log(data);
});

参考文献: jquery.ajax params