UNPKG

xpromisequeue

Version:

这是一个Javascript Promise的执行队列模块,里面的每一个Promise都是按顺序执行的,您也可以指定一定的优先级来决定队列的执行顺序。

335 lines (297 loc) 12.8 kB
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <title></title> <link href="./artDialog/skins/blue.css" rel="stylesheet" /> <script src="./artDialog/artDialog.js"></script> <script src="https://cdn.bootcss.com/require.js/2.3.4/require.min.js"></script> </head> <body> <fieldset> <legend> <strong>Log information:</strong> </legend> <div id="divLog"></div> </fieldset> <br /> <br /> <fieldset> <legend> <strong>Queue information:</strong> </legend> <div id="divQueue"></div> </fieldset> <br /> <br /> <fieldset> <legend> <strong>Action:</strong> </legend> <div> <p style="color:#f00;font-weight:bolder;"> 注:初始队列中已包含两个默认的执行项:【弹窗A】和【弹窗B】 </p> <button id="btnRun" style="color:#f00;">运行队列</button> <button id="btnAdd">追加一项任务至目前队列中</button> <button id="btnAddFirst">追加一项高优先级的任务至目前队列中</button> <button id="btnDestroy">销毁正在执行的队列项</button> <button id="btnDestroyAll">销毁整个队列</button> <br /> <br /> <button id="btnRegUnique">用新的队列项覆盖现有队列,并锁定此队列</button> <button id="btnComplete">检查队列是否已执行完</button> <button id="btnGetCurPromise">设置一个表示当前时刻整个队列执行结束后的回调</button> <br /> <br /> <button id="btnAddBefore">在当前正在执行中的队列项之前加上新的队列项</button> <button id="btnAddAfter">在当前正在执行中的队列项之后加上新的队列项</button> <button id="btnAddToB">在默认弹窗【B】的前后都添加一个新的队列项</button> </div> </fieldset> <script type="text/javascript"> require(['./../build/xPromiseQueue'], (xPromiseQueue) => { let dialogBId = "dialogB"; let { QItem, Queue, Priority } = xPromiseQueue; let test = new Queue(); let obj = null; let divLog = document.getElementById('divLog'); let log = function (str) { if (str) { divLog.innerHTML += `<p>${str}</p>`; } else { divLog.innerHTML += `<p>${this.name}已处理完毕</p>`; } }; let showQueueLog = function () { document.getElementById('divQueue').innerHTML = JSON.stringify(test); }; obj = new QItem(function () { let _this = this; let dg = art.dialog({ content: '我是【A】哦,快点下面的按钮<br />注:如果<strong>取消本弹窗</strong>,则不再往后执行其它队列项!', ok: function () { _this.resolve(); log.call(_this); }, cancel: function () { _this.reject(); log.call(_this); } }); this.destroyCallback = () => { dg.close(); log('已成功销毁该队列项!'); }; }); obj.name = "弹窗A"; test.reg(obj); obj = new QItem(function () { let _this = this; let dg = art.dialog({ content: '我是【B】,你点了吗?', ok: function () { _this.resolve(); log.call(_this); }, cancel: function () { _this.resolve(); log.call(_this); } }); this.destroyCallback = () => { dg.close(); log('已成功销毁该队列项!'); }; }); obj.name = "弹窗B"; obj.id = dialogBId; test.reg(obj); document.addEventListener('click', () => { showQueueLog(); }); showQueueLog(); document.getElementById('btnRun').addEventListener('click', () => { if (test.isWatching()) { log('队列已在运行中,目前正在监听队列状态...'); } test.run(); }); document.getElementById('btnAdd').addEventListener('click', () => { obj = new QItem(function () { let _this = this; let dg = art.dialog({ content: '我是新加的【C】,点一下吧?', ok: function () { _this.resolve(); log.call(_this); }, cancel: function () { _this.resolve(); log.call(_this); } }); this.destroyCallback = () => { dg.close(); log('已成功销毁该队列项!'); }; }); obj.name = '弹窗C'; test.reg(obj); }); document.getElementById('btnAddFirst').addEventListener('click', () => { obj = new QItem(function () { let _this = this; let dg = art.dialog({ content: '我是一个新加的<span style="color:#f00;">高优先级</span>的弹窗【D】,点一下吧?', ok: function () { _this.resolve(); log.call(_this); }, cancel: function () { _this.resolve(); log.call(_this); } }); this.destroyCallback = () => { dg.close(); log('已成功销毁该队列项!'); }; }); obj.name = '高优先级的弹窗D'; test.reg(obj, Priority.High); }); document.getElementById('btnDestroy').addEventListener('click', () => { let cur = test.getCur(); if (null == cur) { log('当前没有正在执行的队列项!'); return; } test.destroy(cur); }); document.getElementById('btnDestroyAll').addEventListener('click', () => { test.clear(); log('已销毁整个队列!'); }); document.getElementById('btnRegUnique').addEventListener('click', () => { obj = new QItem(function () { let _this = this; let dg = art.dialog({ content: '我是一个覆盖现有弹窗的超级弹窗【E】,点一下吧?', ok: function () { _this.resolve(); log.call(_this); }, cancel: function () { _this.resolve(); log.call(_this); } }); this.destroyCallback = () => { dg.close(); log('已成功销毁该队列项!'); }; }); obj.name = '超级弹窗E'; test.regUnique(obj); log('已覆盖整个队列!'); }); document.getElementById('btnComplete').addEventListener('click', () => { let m = test.isComplete(); if (m) { log('已执行完!'); } else { log('未执行完!'); } }); document.getElementById('btnGetCurPromise').addEventListener('click', () => { test.getCurPms().then(() => { alert('这是当前时刻整个队列执行结束后的回调!'); }); }); document.getElementById("btnAddBefore").addEventListener("click", () => { test.regBefore(test.getCur(), new QItem(function () { let _this = this; let dg = art.dialog({ content: '我是在当前项之前插队的新弹窗【F】!', ok: function () { _this.resolve(); log.call(_this); }, cancel: function () { _this.resolve(); log.call(_this); } }); this.destroyCallback = () => { dg.close(); log('已成功销毁该队列项!'); }; this.name = "弹窗F"; })); }); document.getElementById("btnAddAfter").addEventListener("click", () => { test.regAfter(test.getCur(), new QItem(function () { let _this = this; let dg = art.dialog({ content: '我是在当前项之后插队的新弹窗【G】!', ok: function () { _this.resolve(); log.call(_this); }, cancel: function () { _this.resolve(); log.call(_this); } }); this.destroyCallback = () => { dg.close(); log('已成功销毁该队列项!'); }; this.name = "弹窗G"; })); }); document.getElementById("btnAddToB").addEventListener("click", () => { let dialogBQItemObj = test.getQItemById(dialogBId); test.regAfter(dialogBQItemObj, new QItem(function () { let _this = this; let dg = art.dialog({ content: '我是在默认弹窗【B】之后插队的新弹窗【H】!', ok: function () { _this.resolve(); log.call(_this); }, cancel: function () { _this.resolve(); log.call(_this); } }); this.destroyCallback = () => { dg.close(); log('已成功销毁该队列项!'); }; this.name = "弹窗H"; })).regBefore(dialogBQItemObj, new QItem(function () { let _this = this; let dg = art.dialog({ content: '我是在默认弹窗【B】之前插队的新弹窗【I】!', ok: function () { _this.resolve(); log.call(_this); }, cancel: function () { _this.resolve(); log.call(_this); } }); this.destroyCallback = () => { dg.close(); log('已成功销毁该队列项!'); }; this.name = "弹窗I"; })); }); }); </script> </body> </html>