JavaScript-在下一个功能完成之前产生

时间:2018-09-24 06:13:54

标签: 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函数怎么样?那会好吗?我正在寻找所有意见。谢谢。

1 个答案:

答案 0 :(得分:2)

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

是的,这是promises的用例,无论是显式承诺还是async functions提供的承诺。让killMonstercompleteQuest返回一个Promise(通过显式执行或使其成为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);
  }
})();