FeathersJS Hook中如何等待两个Promise并调用两个服务
解决方案
步骤1:修正Hook调用的错误写法
原users.hooks.js里对userDeletion的调用存在逻辑问题:userDeletion是一个工厂函数(返回异步函数的函数),正确调用方式是先执行userDeletion()拿到实际处理函数,再传入context。
步骤2:实现多服务并行调用
要等待两个Promise(调用不同服务),可以用Promise.all并行执行两个服务调用,提升执行效率。下面分两种场景给出修改代码:
场景1:在userDeletion.js中同时调用两个服务
修改userDeletion.js,同时调用replicate和目标服务(比如user-profiles),并用Promise.all等待两者完成:
// userDeletion.js module.exports = () => { return async (context) => { // 定义两个服务调用的Promise const deleteReplicatePromise = context.app.service('replicate').remove({ // ... 填写replicate服务的删除参数 }); const deleteUserProfilePromise = context.app.service('user-profiles').remove({ // ... 填写user-profiles服务的删除参数,示例:关联当前用户ID query: { userId: context.result._id } }); // 并行等待两个Promise完成,解构获取各自结果 const [replicateResult, userProfileResult] = await Promise.all([ deleteReplicatePromise, deleteUserProfilePromise ]); // 按需处理返回结果 console.log('Replicate删除结果:', replicateResult.data[0]); console.log('用户档案删除结果:', userProfileResult); }; };
同步修正users.hooks.js的调用逻辑:
// users.hooks.js const userDeletion = require('../userdeletion/userDeletion'); const triggerUserDeletion = () => { return async (context) => { // 先执行工厂函数拿到处理函数,再传入context调用 const userDeletionHandler = userDeletion(); await userDeletionHandler(context); }; };
场景2:在Hook中调用两个独立处理函数
如果两个服务的删除逻辑需要拆分到不同模块,可以在users.hooks.js中分别调用两个处理函数,并用Promise.all等待:
首先拆分出两个独立处理模块:
// deleteReplicate.js module.exports = () => { return async (context) => { const result = await context.app.service('replicate').remove({ // ... 填写参数 }); console.log('Replicate删除结果:', result.data[0]); }; };
// deleteUserProfile.js module.exports = () => { return async (context) => { const result = await context.app.service('user-profiles').remove({ // ... 填写参数 }); console.log('用户档案删除结果:', result); }; };
然后修改users.hooks.js:
// users.hooks.js const deleteReplicate = require('../userdeletion/deleteReplicate'); const deleteUserProfile = require('../userdeletion/deleteUserProfile'); const triggerUserDeletion = () => { return async (context) => { // 获取两个处理函数 const replicateHandler = deleteReplicate(); const userProfileHandler = deleteUserProfile(); // 并行执行并等待两个处理函数完成 await Promise.all([ replicateHandler(context), userProfileHandler(context) ]); }; };
关键说明
Promise.all适用于无依赖关系的服务调用,能并行执行提升效率;如果两个服务存在依赖(比如需要第一个服务的结果作为第二个的参数),则需改为串行await调用;- 确保服务调用参数正确,比如通过当前用户的标识关联要删除的数据。
内容的提问来源于stack exchange,提问作者cloudscape-germany
相关产品推荐
相关产品推荐

