1
0

taskQueue.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. let LoadingTasks = (() => {
  2. let activeTask = null;
  3. let tasks = [];
  4. let runNextTask;
  5. runNextTask = function() {
  6. if (activeTask || tasks.length === 0)
  7. return;
  8. activeTask = (tasks.shift());
  9. let taskResult = null;
  10. try {
  11. taskResult = activeTask.fnc();
  12. }
  13. catch (err) {
  14. taskResult = Promise.reject(err);
  15. }
  16. if (!(taskResult instanceof Promise))
  17. taskResult = Promise.resolve(activeTask);
  18. taskResult
  19. .then(() => {
  20. let ok = activeTask.ok;
  21. activeTask = null;
  22. ok(taskResult.result);
  23. })
  24. .catch(() => {
  25. let ko = activeTask.ko;
  26. activeTask = null;
  27. ko(taskResult.result);
  28. })
  29. .finally(() => {
  30. runNextTask();
  31. });
  32. };
  33. return {
  34. push: async function(task) {
  35. return new Promise((ok, ko) => {
  36. tasks.push({ fnc: task, ok: ok, ko: ko });
  37. runNextTask();
  38. });
  39. }
  40. };
  41. })();