等待 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>
异步函数中的这段代码没有给出预期的结果:
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>