如何在承诺中执行回调?

时间:2018-01-08 15:46:07

标签: javascript node.js

我这里有一个获得Section的函数。它返回Promise

router.get('/menu_section', (req, res) => {
    Section.read(req.body)
        .then(d => {
            send(d, res);
        })
        .catch(e => {
            error(e, res);
        });
});

有没有办法,当我处理Promise时,我可以减少then catch样板代码?我希望用这种方式来减少锅炉板。

router.get('/menu_section', (req, res) => {
    Section.read(req.body).respond(data, err, res)
});

//handle it in this way for all routes. 
function respond(data, err, res){
  if(err) res.data({err})
  else res.json({data});
}

编辑:我想避免为每个Promise句柄写then catch

3 个答案:

答案 0 :(得分:1)

也许是在讨好?:

const respond = res => data => {
  res.json(data);
};

所以你可以这样做:

router.get('/menu_section', (req, res) => {
    Section.read(req.body).catch(e => e).then(respond(res));
});

然而,我会直接用它制作一个中间件:

const respond = (req, res, next) => {
  Section.read(req.body).then(
   data => res.json(data),
   err => next(err)
  );
};

所以你可以做到

 router.get('/menu_section', respond);

请注意,async / await可以在此处提供帮助:

router.get('/menu_section', async (req, res) => {
 try {
    res.json(await Section.read(req.body));
 } catch(e) {
   res.json(e);
 }
});

答案 1 :(得分:1)

你将无法完全按照你提到的那样做(没有覆盖Promise,这通常是不赞成的。)

然而,您可以创建一个简单的包装函数来为您完成:

function respond(promise, res) {
  promise
    .then(data) => res.data(data))
    .catch(err => res.data({err})
}

router.get('/menu_section', (req, res) => {
  respond(Section.read(req.body), res);
});

你甚至可以把它简化为这样的东西:

function respond(getData) {
  return (req, res) => {
    getData(req)
    .then(data) => res.data(data))
    .catch(err => res.data({err})
  };
}

router.get('/menu_section', respond(req => Section.read(req.body)));

使用第二种方法,你基本上只是提供一个获取数据的函数,然后它将采用它并以标准方式处理它。它还会创建一个用于获取reqres本身的函数。

答案 2 :(得分:0)

如果您希望以这种方式回复所有路线,可以使用Middleware function并在应用范围内使用它。

app.use((req, res, next) => (
  Section.read(req.body)
    .then(d => send(d, res))
    .catch(e => error(e, res));
)

您也可以在每个路由的基础上使用此类功能,甚至每个文件(包含多个路由)。