You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:55:20