Javascript 使用babel时,使用多个同时的jQuery请求获取AJAX响应数据时出现问题

Javascript 使用babel时,使用多个同时的jQuery请求获取AJAX响应数据时出现问题,javascript,jquery,ajax,babeljs,Javascript,Jquery,Ajax,Babeljs,在我的应用程序中,我使用jQuery 2.2.2同时发送几个AJAXpost请求,并构建一个“主”承诺,在所有请求完成时解决,如下所示: let promises = [] //items is 1 or more in length _.forEach(items, (item) => { promises.push( $.ajax({ url: 'some url', method: 'post', data: item })

在我的应用程序中,我使用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(){}
    表示法时,脚本工作正常
  • 当使用
    ()=>{}
    表示法时,回调中的
    参数
    从不包含来自请求的实际响应数据。它包含从标题(my
    item
    变量)发送的数据数组
正确的方法是什么?为什么我不能在回调中获取响应数据? 谢谢

PS:我正在macOS上测试Chrome55.0.2883.95

EDIT:在进一步研究之后,如果我这样编写回调参数,我可以从中获得正确的响应数据:

masterPromise.done((arg1, arg2) => { /*arg1 and arg2 are the two first ajax requests, but arguments is the sent data*/ })
但我无法使用
参数获取它们。我使用babel浏览器作为传输工具,现在我怀疑这可能与此有关。


EDIT2:我稍微修改了我的问题,因为我发现回调中的
()=>{}
符号和babel`的传输存在问题。

这是因为您在这里使用了箭头函数:

.done(() => {
  // ...
})
这并没有填充。如果您真的想使用它(您可能不应该使用),则使用普通功能:

.done(function() {
  console.log(arguments.length)
})

当您使用babel transpiler时,您应该能够使用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;

我认为
$.when.apply($,promissions)
应该是
$.when.apply($.when,promissions)
@JonathanGray-不,这是former@JaromandaX你是对的,出于某种原因,在我的脑海中,我正在阅读
。应用
作为被调用的方法(当然是
。当
时)。我不知道为什么我会这样想,因为我知道
.apply
在做什么。放屁。我想我需要更多的睡眠。哈哈,谢谢!几分钟前我自己发现了这一点并编辑了我的问题,但你证实了我的担心。我不能在这里使用箭头符号。所以问题不是来自巴别塔,而是来自箭头符号。出于某种原因,我认为它们是等价的(除了使用箭头函数时绑定的
this
),您也不需要箭头函数,正常函数在这里也很完美。另一方面,我也不会使用参数。Rest参数对你有用。是的,我使用了arrow函数,因为我需要绑定“this”(在我的示例中没有显示),而且我很懒。你如何继续不使用arguments变量?如果你使用的是babel
masterPromise.done((…args)=>{
then
$。每个(args等
我没有看到您使用这个,所以我假设您不需要箭头函数。当然,否则。使用rest参数请参见上面的注释。