使用babel时,无法通过多个同时发送的jQuery请求获取AJAX响应数据

时间:2017-01-13 09:20:40

标签: javascript jquery ajax babeljs

在我的应用程序中,我使用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>

2 个答案:

答案 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)
})