等待 jQuery.when ajax 请求

Posted

技术标签:

【中文标题】等待 jQuery.when ajax 请求【英文标题】:await for jQuery.when ajax requests 【发布时间】:2018-08-05 07:51:07 【问题描述】:

异步函数中的这段代码,没有给出预期的结果:

var result = await $.when( $.get('/api/1'), $.get('/api/2') );

通过一个请求,结果将是我期望的输出(响应文本)。 但是,对于这两个请求,返回的 result 是一个不包含两个 Promises 值的数组。有什么解决办法吗? 我知道有then()done(),但我更喜欢使用await。

【问题讨论】:

您确定您在控制台中没有收到任何错误吗? jQuery when 返回一个 jQuery 延迟对象(不是 javascript 承诺)...... 没有警告。我得到一个包含 3 个项目的数组。但只有一个 responseText。 你得到两个包含 3 项的数组,每个数组中的第一项是响应文本。 嗯,我只得到一个数组。 result[0] = 响应字符串,result[1] = "成功",result[2] = jqXHR 啊,是的。好吧。使用.done()$.when()await 不兼容。或者改用await Promise.all( [$.get('/api/1'), $.get('/api/2')] ) 【参考方案1】:

jQuery 的.when() 和原生的await 有不同的语义。比较:

// jQuery

$.when(promise1, promise2).done(function (result1, result2) 
    // work with result1 and result2
);

// native

Promise.all([promise1, promise2]).then(function (results) 
    // work with results[0] and results[1]
);

// await is just a variation of the above:

var results = await Promise.all([promise1, promise2]);
// work with results[0] and results[1]

原生实现使用一个包含多个 promise 的数组,而 jQuery 的实现需要多个单独的 promise。

这意味着您不能将await$.when() 一起使用。 await 在异步函数完成时有效地为您提供回调的 first 参数的值。

await 用于Promise.all() 有效,因为第一个参数将是所有结果的数组。将await 用于$.when() 将不起作用,因为第二个结果将是回调的第二个参数,依此类推,这意味着您将丢失除第一个之外的所有结果。

jQuery 的实现早于原生 Promise,他们是这样设计的,现在他们必须坚持下去。这就是生活。

【讨论】:

await $.when(…).then((...results) => results) 可以工作,但我同意,jQuery 承诺很奇怪,应该避免。 但这在 IE11 中不起作用。 ;) 那好吧。无论如何,如果有Promise.all() 可用,就没有太多理由反对$.when() 的实现,在任何支持解构的环境中都是如此。 …甚至支持async/await :-D【参考方案2】:

你不能使用await,但实际上我发现 jQuery 的方式非常直观,甚至是它们传递值的方式

var d1 = $.Deferred();
var d2 = $.Deferred();
var d3 = $.Deferred();

$.when( d1, d2, d3 ).done(function ( v1, v2, v3 ) 
  // v1, v2 and v3 output the resolve
  // of d1, d2 and d3 respectively
  console.log( v1, v2, v3 ); 
);

// done method of $.when will just run when
// all deferred functions are resolved, 
// that is, after two seconds
setTimeout(()=>d1.resolve(),1000);
setTimeout(()=>d2.resolve("abc"),2000);
d3.resolve( 1, 2, 3, 4, 5 );

console.log('Begin...')
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

【讨论】:

以上是关于等待 jQuery.when ajax 请求的主要内容,如果未能解决你的问题,请参考以下文章

jQuery.when 理解

JQuery when() done() then()

有条件地添加到 jQuery .when

有人可以清楚地解释 jQuery.when() 和 deferred.then() 的工作原理吗?

jQuery.when() 是不是对这些函数调用进行排队?

可以在 $.when().done() 中使用带有 ajax 调用的函数吗? [复制]