В этом примере код кнопка Showmenu запрашивает своего рода пользовательское контекстное меню, которое возвращает обещание, ожидающее, чтобы пользователь сделает выбор из меню. Когда меню запрашивается, передается занятость, указывающий, следует ли заблокировать другие события до завершения работы меню. Тем не менее, BushyHandler закончится ожиданием до завершения OptionHandler; И я думаю, что это потому, что все, что делает SelectionHandler, разрешает обещание, и, по -видимому, это не то, что можно ожидать. Я не хочу, чтобы SelectionHanlder вернулся к ожиданию BusyHandler до тех пор, пока не завершится установленное время в OptionHandler. Спасибо. class = "Snippet-Code-JS Lang-JS PrettyPrint-Override">
В этом примере код кнопка Showmenu запрашивает своего рода пользовательское контекстное меню, которое возвращает обещание, ожидающее, чтобы пользователь сделает выбор из меню. Когда меню запрашивается, передается занятость, указывающий, следует ли заблокировать другие события до завершения работы меню. Тем не менее, BushyHandler закончится ожиданием до завершения OptionHandler; И я думаю, что это потому, что все, что делает SelectionHandler, разрешает обещание, и, по -видимому, это не то, что можно ожидать. Я не хочу, чтобы SelectionHanlder вернулся к ожиданию BusyHandler до тех пор, пока не завершится установленное время в OptionHandler. Спасибо. class = "Snippet-Code-JS Lang-JS PrettyPrint-Override">[code]let showMenu = document.querySelector(".showMenu"), menu = document.querySelector(".menu"), mapObj = Object.create(null) ; mapObj.busyType = ''; mapObj.busyState = 0; showMenu.addEventListener('mousedown', OptionHandler, false); menu.addEventListener('mousedown',BusyHandler, false); async function OptionHandler() { let option = await MenuHandler('b'); console.log(option); let d = Date.now(); console.log(`Work began at ${d}`); let p = new Promise( (resolve,reject) => { setTimeout( () => {resolve('delay resolved');}, 2000); }); await p; console.log(`Work completed at ${Date.now()-d}`); } function MenuHandler(busyType) { menu.classList.add('show'); mapObj.busyType = busyType; return new Promise( (resolve, reject) => { // mapObj.resolve = resolve; // mapObj.reject = reject; mapObj.resolve = async function (v) {resolve(v)}; mapObj.reject = async function (v) {reject(v)}; }); } async function SelectionHandler(evt) { let e = evt.target; if ( !e.matches('.menu button, .menu button *') || !(e = e.closest('button')) ) return; menu.classList.remove('show'); await mapObj.resolve(e.value);