NodeJS 承诺,一切都是有条件的承诺

bqucvtff  于 2023-01-25  发布在  Node.js
关注(0)|答案(2)|浏览(147)

我写了一个函数,它将根据条件返回输入承诺或空承诺

export const promiseUtility = (promise, condition) => {
  if (condition) {
    return promise;
  } else {
    return new Promise(resolve => resolve());
  }
};

当我调用这个函数时

const arr= [
      promiseUtility({
        promise: getUsers(req, type, id),
        condition: req.body.shouldGetUsers
      }),
      promiseUtility({
        promise: getObjects(req, type, id),
        condition: req.body.shouldGetObjects,
    ];

    const [users =[], objects =[]] = await Promise.all(arr)

我现在面临的问题是,当shouldGetUsers这样的条件为false时,即使原来的承诺getUsers(req)也得到了解决,看来这是因为我调用了那个getUsers函数,我该如何处理这种情况呢

wwwo4jvm

wwwo4jvm1#

如果你不希望一个承诺被解析,你首先就不能创建它,但是当你把getUsers(req, type, id)作为promise参数传递给你的promiseUtility函数时,你已经创建了一个承诺。
我建议您使用conditional operator,它只在条件为真时才执行getUsers函数:

const arr = [
  req.body.shouldGetUsers ? getUsers(req, type, id) : Promise.resolve(),
  req.body.shouldGetObjects ? getObjects(req, type, id) : Promise.resolve()
];
jvlzgdj9

jvlzgdj92#

我同意海科的回答,但是,我发现如果我们想建立一个通用的效用函数,那么我们可以这样做。

export const promiseUtility = (promise, condition) => {
  if (condition) {
    return promise();
  } else {
    return new Promise(resolve => resolve());
  }
};

const arr= [
  promiseUtility({
    promise: () => getUsers(req, type, id),
    condition: req.body.shouldGetUsers
  }),
  promiseUtility({
    promise: () => getObjects(req, type, id),
    condition: req.body.shouldGetObjects,
  })
];

const [users =[], objects =[]] = await Promise.all(arr)

相关问题