解析并等待 ajax 调用 forEach
Resolve and Wait ajax call in forEach
我知道这里已经找到了问题和答案,这就是我得到示例的地方。
问题是:Other question
这是我的代码:
$('.start').click(function() {
Generate();
})
function Generate()
{
var _p = Promise.resolve();
customers.forEach(customer =>
_p = _p.then(() => AxCall(customer))
);
}
function AxCall(v)
{
$.ajax({
url: '/generate/axgenerate/'+v['clm_customer_id'],
complete: function() {
count++;
$('.completed').text(count);
}
})
}
问题是仍然在这里调用的 ajax 被同时触发。
我该怎么做才能使 ajax 呼叫一个接一个地触发,即使它失败或成功
您需要 return 调用 $.ajax
的结果。 return 值是一个 jQuery 承诺:
function AxCall(v)
{
return $.ajax({
// ^^^^^^
// ...
这样,您设置的承诺链 forEach
使链中的每一步都等待上一步完成。
但是既然ajax无论成功还是失败都想继续,还需要把rejection转化为fulfillment,所以:
customers.forEach(customer =>
_p = _p.then(() => AxCall(customer).catch(error => {});
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^^^^^^^
);
(您可能会以某种方式报告错误,但这里的关键是 catch
将捕获拒绝并将其转换为履行 [如果您不 throw
或 return is/will 被拒绝的承诺。)
如果能用async
函数和await
就简单一点:
async function Generate()
{
for (const customer of customers) {
try {
await $.ajax({
url: '/generate/axgenerate/'+v['clm_customer_id'],
complete: function() {
count++;
$('.completed').text(count);
}
});
} catch (error) {
// (perhaps report error here)
}
}
}
我知道这里已经找到了问题和答案,这就是我得到示例的地方。 问题是:Other question
这是我的代码:
$('.start').click(function() {
Generate();
})
function Generate()
{
var _p = Promise.resolve();
customers.forEach(customer =>
_p = _p.then(() => AxCall(customer))
);
}
function AxCall(v)
{
$.ajax({
url: '/generate/axgenerate/'+v['clm_customer_id'],
complete: function() {
count++;
$('.completed').text(count);
}
})
}
问题是仍然在这里调用的 ajax 被同时触发。 我该怎么做才能使 ajax 呼叫一个接一个地触发,即使它失败或成功
您需要 return 调用 $.ajax
的结果。 return 值是一个 jQuery 承诺:
function AxCall(v)
{
return $.ajax({
// ^^^^^^
// ...
这样,您设置的承诺链 forEach
使链中的每一步都等待上一步完成。
但是既然ajax无论成功还是失败都想继续,还需要把rejection转化为fulfillment,所以:
customers.forEach(customer =>
_p = _p.then(() => AxCall(customer).catch(error => {});
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^^^^^^^
);
(您可能会以某种方式报告错误,但这里的关键是 catch
将捕获拒绝并将其转换为履行 [如果您不 throw
或 return is/will 被拒绝的承诺。)
如果能用async
函数和await
就简单一点:
async function Generate()
{
for (const customer of customers) {
try {
await $.ajax({
url: '/generate/axgenerate/'+v['clm_customer_id'],
complete: function() {
count++;
$('.completed').text(count);
}
});
} catch (error) {
// (perhaps report error here)
}
}
}