在我的应用程序中,我使用jQuery 2.2.2同时发送几个AJAX (?:...)
请求,并构建一个“主”承诺,在所有请求完成后解析,如下所示:
post
这里有几个问题:
let promises = []
//items is 1 or more in length
_.forEach(items, (item) => {
promises.push(
$.ajax({
url: 'some url',
method: 'post',
data: item
})
)
})
let masterPromise = $.when.apply($, promises)
masterPromise.done(() => {
let result = []
let json
if (promises.length === 1) {
json = arguments[0]
//do something with json
} else {
$.each(arguments, function (index, responseData) {
json = responseData[0]
result.push(json)
})
//do something with result: an array of json responses
}
})
return masterPromise
表示法时,脚本可以正常运行function() {}
表示法时,回调中的() => {}
永远不会包含请求中的实际响应数据。它包含标题中已发送数据的数组(我的arguments
变量)执行此操作的正确方法是什么?为什么我无法在回调中获取响应数据? 谢谢!
PS:我在macOS上测试Chrome 55.0.2883.95
编辑:经过调查后,我可以从回调参数中获取正确的响应数据,如果我这样写:
item
但我无法通过masterPromise.done((arg1, arg2) => { /*arg1 and arg2 are the two first ajax requests, but arguments is the sent data*/ })
获取它们。我使用babel-browser作为转换器,我现在怀疑它可能与此有关。
EDIT2:我稍微修改了我的问题,因为我发现问题在回调中使用arguments
符号,并且使用babel`进行转换。 < / p>
答案 0 :(得分:2)
当您使用babel转换器时,您应该能够使用rest参数语法(...args) => {}
- 总体而言,使用babel您应该能够简化代码
let promises = items.map((item) =>
$.ajax({
url: 'some url',
method: 'post',
data: item
})
);
let masterPromise = $.when.apply($, promises);
masterPromise.done((...args) => {
let result;
let json;
if (args.length === 1) {
json = args[0]; // shouldn't this be args[0][0] ?
//do something with json
} else {
result = args.map(responseData => responseData[0]);
//do something with result: an array of json responses
}
});
return masterPromise;
答案 1 :(得分:1)
这是因为你在这里使用箭头功能:
.done(() => {
// ...
})
不会填充arguments
object。如果你真的想使用它(你可能不应该),那么使用普通函数:
.done(function() {
console.log(arguments.length)
})