Eug*_*ash 7 javascript blocking
我需要修改一些旧的 javascript 代码。有一个地方我想等到用户按下两个按钮之一,然后继续程序流程(如prompt()函数)。如何做到这一点?
只需创建一个承诺并将解析函数存储在其范围之外的全局变量中。然后让程序等待 promise 解决(使用“async”和“await”)。该承诺通过调用该全局变量在单击按钮时得到解决。我在国际象棋程序中使用了这种技术来等待促销弹出窗口的答案:
var _promote; /* resolve-function reference */
async function promote_piece(pce, fld, clr) {
var type;
(...)
show_mpw(clr); /* show modal promotion window */
var promise = new Promise((resolve) => { _promote = resolve });
await promise.then((result) => { type = result });
if (type === undefined) type = "Q";
(...)
}
Run Code Online (Sandbox Code Playgroud)
所以在创建promise之后,程序会一直等到弹出窗口解决它。弹出窗口在关闭时按如下方式解析承诺:
_promote(type); /* resolve promotion-promise */
Run Code Online (Sandbox Code Playgroud)
注意请记住,在这种情况下,promotion_piece() 函数本身也必须使用“await”关键字调用!否则程序将异步执行并继续执行
您需要在此时中断您的函数,并添加另一个函数来捕获用户的按钮按下事件。
您可以使用Narrative Javascript引入阻塞行为并简化它(这样您就不需要将函数分成两部分),但请注意,该库自 2013 年以来已被废弃。