Ну, самый простой способ - переключить ваш .forEach()
l oop на обычный for
l oop внутри функции async
и затем использовать await
:
async function run() {
const start = new Date().getTime();
const testSuiteInputs = [
{delay: 0.5, length: 100},
{delay: 0.4, length: 500},
// more tests here
];
for (let item of testSuiteInputs) {
let url = `${testUrl}?delay=${item.delay}&length=${item.length}`;
let result = await $.ajax(url);
// process result here
}
}
run().then(finalResult => {
console.log("all done");
}).catch(err => {
console.log(err);
});
Чтобы сделать это без использования async/await
, общий шаблон проектирования для упорядочения асинхронного доступа к массиву должен использовать .reduce()
, когда вы просто объединяете обещания вместе:
const start = new Date().getTime();
const testSuiteInputs = [
{delay: 0.5, length: 100},
{delay: 0.4, length: 500},
// more tests here
];
testSuiteInputs.reduce((p, item) => {
return p.then(() => {
// when previous ajax call finished, start the next one
let url = `${testUrl}?delay=${item.delay}&length=${item.length}`;
return $.ajax(url).then(result => {
// process individual result here
});
});
}, Promise.resolve()).then(finalResult => {
console.log("all done");
}).catch(err => {
console.log(err);
});;