Javascript 当使用rest运算符不能按预期工作时

Javascript 当使用rest运算符不能按预期工作时,javascript,jquery,ajax,promise,.when,Javascript,Jquery,Ajax,Promise,.when,因此,在我们的代码库中,我们只对代码库的ajax部分使用jquery,但我们希望包装所有调用,因此如果我们希望最终摆脱jquery,那么我们只需要更改实现。下面是包装器的定义 export const getAll = (...ajaxCalls) => { // return $.when($.ajax(ajaxCalls)); return $.when(ajaxCalls.map(call => $.ajax(call))); } 这就是我们称之为“它”的地方

因此,在我们的代码库中,我们只对代码库的ajax部分使用jquery,但我们希望包装所有调用,因此如果我们希望最终摆脱jquery,那么我们只需要更改实现。下面是包装器的定义

export const getAll = (...ajaxCalls) => {
    // return $.when($.ajax(ajaxCalls));
    return $.when(ajaxCalls.map(call => $.ajax(call)));
}
这就是我们称之为“它”的地方

getAll(`/response/${customerId}`, `/response/${methods}`).done((response1, response2) => {
  console.log("getAll1",response1);
  console.log("getAll2",response2);
})
然而,反应是这样的:


我对什么时候的理解是,response1应该包含response1的responseBody,response2应该包含response2的responseBody,但事实似乎并非如此。我遗漏了什么?

您似乎正在记录jqHXR对象,这可能是
jQuery.ajax()
jQuery.when()
交互传递结果的奇怪方式的结果

为了在稍后阶段清除jQuery,我冒昧地建议您需要在这个阶段标准化所有调用。这相当简单,只需使用
.then()
而不是
.done()
,并期望结果以数组形式传递:

getAll(`/response/${customerId}`, `/response/${methods}`)
.then(results => {
    console.log("getAll0", results[0]);
    console.log("getAll1", results[1]);
});
然后,为了标准化
jQuery.ajax()
jQuery.when()
行为的各个方面,您需要在
getAll()
中跳过一些障碍:

  • 将jQuery.when()的传递结果标准化为单个参数,而不是数组
  • 将jQuery.ajax()的(数据、状态文本、jqXHR)交付标准化到其成功路径
  • 标准化jQuery.ajax()将(jqXHR、statusText、errorshown)传递到其错误路径
  • 跨不同版本的jQuery标准化
    jQuery.ajax()
    的错误处理程序的行为
成功处理程序可能是不必要的,因为
承诺。all()
聚合将自动导致
statusText
jqXHR
被丢弃,但明确这些丢弃不会造成真正的伤害,除非您需要对毫秒感到困扰

从错误处理程序返回
$.Deferred().reject(新错误(textStatus | | errorshown)).promise()
在所有版本的jQuery中都应该给出相同的行为,导致错误对象在错误路径上传递。(但记录的错误消息会有所不同)请确保测试此项

export const getAll = (...ajaxCalls) => {
    function makeAjaxCallAndStandardizeResponse(call) {
        return $.ajax(call)
        .then(
            // success handler: standardize success params
            (data, statusText, jqXHR) => data, // discard statusText and jqXHR
            // error handler: standardize error params and ensure the error does not remain "caught".
            (jqXHR, textStatus, errorThrown) => $.Deferred().reject(new Error(textStatus || errorThrown)).promise(); // discard jqXHR, and deliver Error object on the error path.
        );
    }
    // Aggregate with Promise.all() instead of jQuery.when() to cause a javascript Promise to be returned and results to be delivered as Array.
    return Promise.all(ajaxCalls.map(makeAjaxCallAndStandardizeResponse));
}