jQuery ajax :在回调之前执行数据处理
jQuery ajax : perform a data treatment before callback
我正在编写一个库来访问服务器中的数据,并将格式化的数据返回给我函数的使用者。以下是我想要的一个例子:
// my code
var model = function () {
return $.ajax(myRequest).done(function (rawData) {
return treatment(data);
});
}
// client code
var useModel = function () {
var modelPromise = model();
modelPromise.done(function (formattedData) { // consume this result })
}
其中格式化数据是我第一次完成回调的结果,而不是原始数据。
你有什么想法吗?
谢谢
R.
Regis,
jQuery的.then()文档说:
从jQuery 1.8开始,deferred.then()方法返回一个新的承诺。 可以通过 函数,替换现已弃用的 deferred.pipe() 方法。
.then()
的第二个示例类似于您想要的(尽管不涉及 ajax)。
据我所知,对您的代码的必要更改非常少:
// my code
var model = function () {
return $.ajax(myRequest).then(function (rawData) {
return treatment(rawData);
});
}
// client code
var useModel = function () {
var modelPromise = model();
modelPromise.done(function (formattedData) { // consume this result })
}
Regis,
我非常喜欢甜菜根的回答。 这是我在尝试自己理解这个概念时所做的一个例子:使用 jQuery 的多个异步请求。
来源来自jsFiddle:
var logIt = function (msg) {
console.log(((new Date()).toLocaleTimeString()) + ": " + msg);
}, pauseBrowser = function (ms) {
ms += new Date().getTime();
while (new Date() < ms) {}
}, dataForService1 = {
json: JSON.stringify({
serviceNumber: 1,
description: "Service #1's data",
pauseAfterward: 3 // for pausing the client-side
}),
delay: 0 // delay on the server-side
}, dataForService2 = {
json: JSON.stringify({
serviceNumber: 2,
description: "Service #2's data",
pauseAfterward: 1
}),
delay: 0 // delay on the server-side
};
function getAjaxConfiguration() {
return {
type: 'POST',
url: '/echo/json/',
success: function (data) {
var msg = "Handling service #" + data.serviceNumber + "'s success";
logIt(msg);
logIt(JSON.stringify(data));
}
};
}
var async2 = function () {
var ajaxConfig = $.extend(getAjaxConfiguration(), {
data: dataForService2
});
return $.ajax(ajaxConfig);
};
var async1 = function () {
var ajaxConfig = $.extend(getAjaxConfiguration(), {
data: dataForService1
});
return $.ajax(ajaxConfig);
};
var do2AsynchronousFunctions = function () {
var dfd = new $.Deferred();
async1()
.then(function (async1ResponseData) {
logIt("async1's then() method called, waiting " + async1ResponseData.pauseAfterward + " seconds");
pauseBrowser(async1ResponseData.pauseAfterward * 1000);
})
.done(function (a1d) {
logIt("async1's done() method was called");
return async2()
.then(function (async2ResponseData) {
logIt("async2's then() method called, waiting " + async2ResponseData.pauseAfterward + " seconds");
pauseBrowser(async2ResponseData.pauseAfterward * 1000);
})
.done(function (a2d) {
logIt("async2's done() method was called");
dfd.resolve("final return value");
});
});
return dfd.promise();
};
$.when(do2AsynchronousFunctions()).done(function (retVal) {
logIt('Everything is now done! Final return value: ' + JSON.stringify(retVal));
});
相关文章:
- 执行批处理文件的Javascript,该文件包含基于每个会话的环境变量设置
- 如何在 JavaScript 中逐个执行批处理文件
- 结合 href 引导程序自动执行数据切换
- 在 ajax 之后执行数据表或重新绘制表
- 阻止执行数据 ajax 属性
- 执行 C# 事件处理程序,然后执行该 js 函数
- EmberJS 应用程序中列表 + 详细信息 + 编辑视图的数据处理
- 如何通过文件 API 从 json 文件执行数据
- 如何在D3地图中进行时间数据处理
- JavaScript函数数据处理
- 画布已被跨源数据处理所污染
- 如何在redux中强制执行数据约束
- 如何将全局状态数据处理到Redux中的深度嵌套组件中
- D3js奇怪的日期和数据处理
- 用它的数据处理数组中的每一项
- 将嵌套json数据处理成数据连接
- 二进制数据处理和位与
- 使用Processing.js:我可以有多个画布只有一个数据处理源sketch.pde
- JQuery Post数据处理
- jQuery ajax :在回调之前执行数据处理