首页 > 解决方案 > jQuery $.post 从函数内部返回数据

问题描述

我想从函数的返回数据中设置一个变量,但是,里面有一个 $.post() 调用。如何修改以下代码以返回数据。我看过一堆建议,但似乎没有一个有效。

目前 .then() 中的 sData 是一个全局变量,我想将其用作返回值,因此任何地方的本地调用都var thisData = getItemData(id, div);将与当前的全局变量 sData 相同。我看到使用回调函数,但这并不能解决问题,因为我必须在该回调中使用全局变量。

原谅复杂的三元,有 3 种可能的 JSON 类型可以返回服务器端。

function getItemData(id, div) {
    typeof id !== 'undefined' ? id : '220';
    typeof div !== 'undefined' ? div : '';
    beginLoading(div);
    return $.post({
        url: '/content/itemsjson/?categoryid=' + id,
        data: { },
        async: false,
    })
    .done(function(data, status, request) {
        //***
    })
    .fail(function(xhr, textStatus, errorThrown) {
        //***
    })
    .always(function(data) {
        //***
    })
    .then(function(data) {
        stopLoading(div);
        sData = (typeof data == 'string') ? JSON.parse(data.responseText) : (data[0] ? data[0] : data);
    });
}

标签: jquery

解决方案


使用同步调用意味着您将冻结浏览器直到获得响应。而不是你应该使用Deferredobject :

function getItemData(id, div) {
    typeof id !== 'undefined' ? id : '220';
    typeof div !== 'undefined' ? div : '';
    beginLoading(div);
    var dfd = $.Deferred();
    $.post({
        url: '/content/itemsjson/?categoryid=' + id
    })
    .fail(function(xhr, textStatus, errorThrown) {
        dfd.reject(xhr);
    })
    .then(function(data) {
        stopLoading(div);
        sData = (typeof data == 'string') ? JSON.parse(data.responseText) : (data[0] ? data[0] : data);
        dfd.resolve(sData);
    });
    return dfd.promise();
}

推荐阅读