使用Sequelize findOne方法在Bluebird中进行并发调用。返回undefined

时间:2017-11-01 10:18:27

标签: promise sequelize.js bluebird

我想验证来自多个表的特定用户数据是否存在以使其成为并发调用我正在使用Bluebird Promise.Prop,如下所示。数据加入使用sequelize ORM。

Promise.props({
  user: (()=>{
    return User.findOne({
        where: {username: req.user.username}

    });
  }),
  comments: (()=>{
    return comments.findOne({
        where: {username: req.user.username}

    });
  })
}).then((result)=> {
    console.log(result.user.name, result.comments.count);
});

我也试过嵌套的诺言,但没有成功。像

 Promise.props({
   user: (()=>{
    return User.findOne({
        where: {username: req.user.username}

    }).then((user)=>{
      console.log(user.name); // even here i am getting undefined
    });
  }),
  comments: (()=>{
    return comments.findOne({
        where: {username: req.user.username}

    });
  })
}).then((result)=> {
    console.log(result.user.name, result.comments.count);
});

2 个答案:

答案 0 :(得分:1)

您不清楚result.user是否未定义,或result.user.name未定义。 我期待后者。

将带有2个键的对象传递给Promise.props。 但是这两个键都是一个功能,而不是一个承诺。所以promise.props看到的是功能,而不是承诺。 结果应该仍然有2个功能。

尝试

Promise.props({
  user: User.findOne({
        where: {username: req.user.username}
  }),
  comments: comments.findOne({
        where: {username: req.user.username}
  })
}).then((result)=> {
    console.log(result.user.name, result.comments.count);
});

其他好方法是Promise.all,或者如果你知道你有多少承诺,那么使用Promise.join

Promise.join(
  User.findOne({
        where: {username: req.user.username}
  }),
  comments.findOne({
        where: {username: req.user.username}
  }),
  (user, comment) => {
    console.log(user.name, comments.count);
  }
);

答案 1 :(得分:0)

您将返回Promise本身而非结算值。结果需要在承诺解决方案中收集,然后传递。

// collect values in this object
const values = {};
// run all promises
Promise.all([
  model.findOne()
  .then((val) => {
    // assign result 1
    values.val1 = val;
    return Promise.resolve();
  }),
  model.findOne()
  .then((val) => {
    // assign result 2
    values.val2 = val;
    return Promise.resolve();
  }),
])
.then(() => {
  // the values will be collected here.
  console.log(values);
});