我有一个执行三个不同任务的功能,效果很好。为了更好的可重用性,我试图将它们分成三个独立的钩子。 它们看起来像这样:
module.exports = function(options = {}) {
return function hookFunction(hook) {
//do stuff and set variables
function(hook.params.var){ ... } // only in second and third
hook.params.var = var; // only in first and second
return Promise.resolve(hook);
};
};
我的service.hook文件包含:
module.exports = {
before: {
find: [ firstHook(), secondHook(), thirdHook() ]}}
现在它们似乎同时运行,这导致第三个引发由第一个和第二个丢失数据引起的错误。我希望他们一个接一个地跑。我怎么能实现这一目标?
(我尝试在.then
中使用service.hook
,但会抛出TypeError: hookFunction(...).then is not a function
。)
我已阅读How to run synchronous hooks on feathersjs但我不太清楚在哪里放置链接 - 在第三个钩子或服务钩子或其他地方?
答案 0 :(得分:2)
Hooks将按照它们注册的顺序运行,如果它们返回一个promise(或者是async
函数),它将等待该promise的解析。最常见的错误是,如果它们一次运行但应该按顺序运行,则不会返回任何承诺或错误的承诺,但是从代码示例中就不清楚是否是这种情况。以下示例将起作用并等待一秒,然后打印当前名称并移至下一个:
function makeHook(name) {
return function(context) {
return new Promise(resolve => {
setTimeout(() => {
console.log(`Running ${name}`);
resolve(context);
}, 1000);
});
}
}
module.exports = {
before: {
find: [ makeHook('first'), makeHook('second'), makeHook('third') ]}}