ESLint一致返回和嵌套回调

时间:2016-11-08 16:54:34

标签: javascript node.js ecmascript-6 lint eslint

我遇到了ESLint提供的consistent-return规则的一些问题。下面的代码将为consistent-return回调函数抛出User.findOne警告。据我所知,如果没有.remove且有findErr,我只能执行existingUser操作。

避免这些嵌套回调的最佳做法是什么?我想通过consistent-return警告,但还没有真正在线看到任何解决方案。

function remove(req, res) {
  User.findOne({ username: req.params.username }, (findErr, existingUser) => {
    if (findErr) return res.status(500).send(errorHandler.getErrorMessage(findErr));
    if (!existingUser) return res.status(404).send({ message: 'User not found' });

    existingUser.remove((removeErr) => {
      if (removeErr) return res.status(500).send(errorHandler.getErrorMessage(removeErr));

      return res.json({ message: `${existingUser.username} successfully deleted` });
    });
  });
}

1 个答案:

答案 0 :(得分:1)

  

避免这些嵌套回调的最佳做法是什么?

承诺。

  

我想传递一致回复警告

那么你最好不要使用早期回报。相反,写

function remove(req, res) {
  User.findOne({ username: req.params.username }, (findErr, existingUser) => {
    if (findErr) res.status(500).send(errorHandler.getErrorMessage(findErr));
    else if (!existingUser) res.status(404).send({ message: 'User not found' });

    else existingUser.remove((removeErr) => {
      if (removeErr) res.status(500).send(errorHandler.getErrorMessage(removeErr));

      else res.json({ message: `${existingUser.username} successfully deleted` });
    });
  });
}

或者,您应该可以

function remove(req, res) {
  User.findOne({ username: req.params.username }, (findErr, existingUser) => {
    if (findErr) {
      res.status(500).send(errorHandler.getErrorMessage(findErr));
      return;
    }
    if (!existingUser) {
      res.status(404).send({ message: 'User not found' });
      return;
    }
    existingUser.remove((removeErr) => {
      if (removeErr) {
        res.status(500).send(errorHandler.getErrorMessage(removeErr));
        return;
      }
      res.json({ message: `${existingUser.username} successfully deleted` });
    });
  });
}

您还可以启用{ "treatUndefinedAsUnspecified": true }选项并使用return void …