首页 > 解决方案 > JavaScript - 直到下一个函数完成为止

问题描述

假设我有一个简单的 Node.js 应用程序,它在另一个文件中包含这些方法:

module.exports = {
  completeQuest(data) {
    // Code here
  },
  killMonster(data) {
    // Also code here
  },
};

而且它们不是 AJAX 命令。这些只是在应用程序中操作一些数据。我会这样导出allActions.js

const player = require('./playerActions');

module.exports = {
  player,
};

当然后来,在主 JS 文件中const actions = require('./allActions');

所以,一般来说,我会这样做:

actions.player.killMonster();
actions.player.completeQuest();

但我希望他们一个接一个地行动。我知道我可以做到async/await,但我没有做任何 AJAX 调用,所以Promise仍然是最好的方法吗?

使用yield函数呢?那会好吗?我正在寻找意见。谢谢你。

标签: javascript

解决方案


我将假设killMonstercompleteQuest执行异步操作。(您说过它们“不是 ajax”,但您的问题表明它们也不是同步的。)

是的,这是promise的一个用例,无论是显式的 promise 还是由asyncfunctions提供的。拥有killMonstercompleteQuest返回一个承诺(通过明确地这样做或使它们async发挥作用),然后:

actions.player.killMonster()
.then(
    () => actions.player.completeQuest()
)
.catch(error => {
    // Handle error
});

或者,在一个async函数中:

try {
    await actions.player.killMonster();
    await actions.player.completeQuest();
} catch (error) {
    // Handle error
}

这是一个用于提供异步部分的简单async/await示例:setTimeout

const delay = (ms, ...args) =>
  new Promise(resolve => {
    setTimeout(resolve, ms, ...args);
  });

// Stand-ins for the actions
const player = {
  actions: {
    async killMonster() {
      await delay(500, "monster killed");
    },
    async completeQuest() {
      await delay(800, "quest complete");
    }
  }
};

// Top-leve async function (see my answer here:
// https://stackoverflow.com/questions/46515764/how-can-i-use-async-await-at-the-top-level
(async () => {
  try {
    console.log("Killing monster...");
    await player.actions.killMonster();
    console.log("Monster killed; completing question...");
    await player.actions.killMonster();
    console.log("Quest complete");
  } catch (e) {
    // Deal with error (probably don't just dump it to the console like this does)
    console.error(e);
  }
})();


推荐阅读