Javascript 当使用rest运算符不能按预期工作时
因此,在我们的代码库中,我们只对代码库的ajax部分使用jquery,但我们希望包装所有调用,因此如果我们希望最终摆脱jquery,那么我们只需要更改实现。下面是包装器的定义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))); } 这就是我们称之为“它”的地方
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));
}