等待 jQuery.when ajax 个请求

await for jQuery.when ajax requests

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

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

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

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]

本机实现使用一个包含多个承诺的数组,而 jQuery 的实现需要多个单独的承诺。

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

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

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

您不能使用 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>