【问题标题】:Run asynchronous commands in a webpage with node.js / electron / javascript使用 node.js / electron / javascript 在网页中运行异步命令
【发布时间】:2019-04-10 20:45:11
【问题描述】:

编辑:使用BrowserWindow

在网页中一个接一个地启动 javascript 命令的最简单/最好的方法是什么? (异步,非同步)
例如,keypress 事件触发的多个document.write

document.write("line 1");
wait_for_key_press();
document.write("line 2");
wait_for_key_press();
document.write("line 3");
wait_for_key_press();
document.write("line 4");
...

function wait_for_key_press(){
 ...
}

【问题讨论】:

  • 尝试提醒或提示
  • 如果它们是同步的,那是自动的——它们天生就会一个接一个地运行。我不确定我是否理解这个问题。
  • "一个接一个?"暗示你想要asynchronous
  • 您应该等待wait_for_key_press 电话
  • 抱歉,已编辑,我的意思是相反的:P

标签: javascript node.js electron


【解决方案1】:

在运行代码之前等待操作的最简单方法是使用 Promise 或事件侦听器(或同时使用两者)。例如:

var resolves = [];

document.querySelector("#start").addEventListener("click", doActions);
document.querySelector("#stop-wait").addEventListener("click", function() {
  resolves.forEach(function(resolve) {
    resolve();
  });
  resolves = [];
});

function waitButtonClick() {
  return new Promise(function(resolve) {
    resolves.push(resolve);
  });
}

function doActions() {
  console.log("Step 1");
  waitButtonClick().then(function() {
    console.log("Step 2");
  });
}
<button id="start">Start Actions</button>
<button id="stop-wait">Stop waiting</button>

同样可以使用awaitasync来完成:

var resolves = [];

document.querySelector("#start").addEventListener("click", doActions);
document.querySelector("#stop-wait").addEventListener("click", function() {
  resolves.forEach(function(resolve) {
    resolve();
  });
  resolves = [];
});

function waitButtonClick() {
  return new Promise(function(resolve) {
    resolves.push(resolve);
  });
}

async function doActions() {
  console.log("Step 1");
  await waitButtonClick();
  console.log("Step 2");
}
<button id="start">Start Actions</button>
<button id="stop-wait">Stop waiting</button>

Promiseasyncawait 仅在现代浏览器和节点中实现(这应该适合您的情况,因为您使用的是电子)。如果你还想支持 IE,你可以创建一个自定义的 Promise polyfill:

if (typeof window["Promise"] !== "function") {
  window["Promise"] = function(callBack) {
    var catchList = [];
    var thenList = [];
    this.then = function(callBack) {
      if (typeof callBack === "function") thenList.push(callBack);
      return this;
    };
    this.catch = function(callBack) {
      if (typeof callBack === "function") catchList.push(callBack);
      return this;
    };

    function resolve(result) {
      thenList.forEach(function(callBack) {
        callBack(result);
      });
    };

    function reject(error) {
      catchList.forEach(function(callBack) {
        callBack(error);
      });
    };
    callBack(resolve, reject);
  };
}

【讨论】:

  • 太棒了,我能够使用 await/async 来调整它。谢谢!
  • 很高兴我能帮助@bobdylan。我也刚刚更新了我的答案,如果你需要在 IE 或其他旧浏览器中实现类似的东西,你应该做什么
  • @bobdylan 我想你也应该看看这个question关于被遗忘的承诺
【解决方案2】:

这可以通过async / await 语法实现。要等待按键,请将事件侦听器添加到 keypress 事件。在这个例子中,当用户按下回车键时,第 2 行被打印出来。

async function myProgram() {
  console.log('line 1')
  await myAsyncFunction();
  console.log('line 2');
}
myProgram();

async function myAsyncFunction(){
 return new Promise((resolve) => {
  document.addEventListener('keypress', function _listener(event) {
    if (event.keyCode === 13) {
      document.removeEventListener('keypress', _listener);
      resolve();
    }
  });
 });
}

【讨论】:

  • 我实际上需要通过按键触发每一行(编辑过的原始帖子)
猜你喜欢
  • 2021-01-14
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多