jquery - 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);
});
}
解决方案
使用同步调用意味着您将冻结浏览器直到获得响应。而不是你应该使用Deferred
object :
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();
}
推荐阅读
- css - 如何解决链接在 woocommerce 侧边栏打开时无法在移动设备上运行的问题?
- c++ - 将元素从 std::string 推送到字符串类型堆栈时出错
- vue.js - 如何更改根 Vue 实例上的道具?
- google-cloud-platform - 如何在虚拟机实例中应用滚动更新,而不是在 GCP 中使用托管实例组?
- javascript - 如何从 webpack 包中提取 Babel 生成的代码到一个新的块中
- excel - 使用列表突出显示文本字符串
- typescript - 阻止 Visual Studio Code 在我的 Web 浏览器中打开 ESLint 文档
- typescript - TypeScript 定义合并对象,但防止对象属性中不同类型的合并
- c# - 一旦 AccessToken 被删除或撤销,LinkedIn 身份验证自动重定向代码 = null
- getstream-io - 快速的 getstream-io api 中的重复注释