Это реализация асинхронной очереди с использованием обещаний.https://gist.github.com/thejuan/5697765
Он написан на TypeScript, но слишком мало, чтобы перейти на чистый JS.
Продолжается при ошибке, если вы этого не хотите, есть более простые решения, чем эта (просто цепочкакаждый из ваших вызовов, используя затем)
Примечание: Требуется Jquery 1.8 или выше, когда они сделали .then ведут себя "правильно"
export class AsyncExecutionQueue{
private tail: JQueryPromise = $.Deferred().resolve();
public enqueue(cmd:()=>any): JQueryPromise {
console.log("Queuing Command");
var next = $.Deferred();
var client = $.Deferred();
this.tail.always(() => {
try {
var result = cmd();
if (result.done && result.fail) {
result
.done(client.resolve, next.resolve)
.fail(client.reject, next.resolve);
}
else {
client.resolve(result);
next.resolve();
}
}
catch (e) {
client.reject(e);
next.resolve();
}
});
this.tail = next;
return client;
}
}