使用promises

时间:2017-10-01 08:53:20

标签: javascript node.js promise

我想从路线中取出我的CRUD逻辑并将其放入服务层。

所以基本上我想像这样调用服务层:

const service = require("../service/post")

router.post("/new", (req, res) => {
    service.createPost(req.body.titel, req.body.description, req.body.tags, function(id){
        console.log("Created post with id: " + id)
        res.redirect("index")
    })
})

在我的postService.js文件中,我有以下功能:

function createPost(titel, description, tags, callback) {

    const post = {
        titel: titel,
        description: description,
        tags: tags,
        createdAt: new Date(),
        deleted: false,
    }
    console.log("Create Post: " + post.titel + " " + post.description + " " + post.tags + " " + post.createdAt + " " + post.deleted)

    knex("posts").insert(post, "id").then(id => {
        console.log(id)
        callback(id[0])
    })
}

目前我正在使用callback来处理此功能。

任何建议如何使用更基于承诺的样式来返回id,并且路由器中的代码在承诺完成时等待?

感谢您的回复!

1 个答案:

答案 0 :(得分:2)

在您的示例中,您可以删除callback参数并返回knex

返回的承诺
createPost(...) {
  ...
  return knex('posts').insert(post, "id");
}

然后在你的路线中你可以await结果

router.post('/new', async (req, res) => {
  const id = await service.createPost(...);
  console.log("Created post with id: " + id[0]);
  res.redirect("index");
});

或者,如果您想预处理来自knex的响应(因为它返回一个数组),那么您可以返回一个新的Promise

async createPost(...) {
  ...
  const result = await knex('posts').insert(...);
  return result[0];
}

FWIW我建议使用后者,因为它可以在各层之间提供清晰的分离。