使用 Sequelize findOne 方法在 Bluebird promise 中进行并发调用。 Returns 未定义

Making concurrent call in Bluebird promise using Sequelize findOne method . Returns undefined

我想验证来自多个表的特定用户数据是否存在,以使其成为我正在使用 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,但没有成功。喜欢

 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);
});

您返回的是 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);
});

你不清楚是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);
  }
);