假设我有一个简单的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
函数怎么样?那会好吗?我正在寻找所有意见。谢谢。
答案 0 :(得分:2)
我将假设killMonster
和completeQuest
执行异步操作。 (您已经说过它们不是“ ajax”,但您的问题表明它们也不是同步的。)
是的,这是promises的用例,无论是显式承诺还是async
functions提供的承诺。让killMonster
和completeQuest
返回一个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);
}
})();