序列化同步ORM



你好,我正在使用sequelize,我想做一个同步查询,但这是异步的,并返回一个错误的响应。我有这样的代码:

function(user) {
  var allow = false;
  return User.find({ where: { id: user.id},
    include: [{
      model: Plan,
      attributes: ['id', 'name']
    }]
  }).then(function(u) {
    if(!u) throw new Error("0 user not found");
    user = u.dataValues;
    var plan = user.plan.dataValues.name;
    else if (plan == "Premium") allow = true;
    console.log("allow", allow);
    return allow;
  }).catch(function(error){
    console.log("error:::", error);
  });
}

console.log('allow', allow);打印的是true,但是当我调用函数时,函数返回的是false

你不能让异步代码同步,所以你必须处理异步性。

然而,它不是困难,因为你的函数已经返回一个承诺。您可以使用它将allow变量传递给调用者:

yourFunction(user).then(function(allow) {
  console.log('allow', allow);
});

我认为return allow;语句是.then()内部function(u) {}函数的返回值,而不是function (user) {}

此外,User.find()返回一个promise。如果你读了《应许》,你会发现有一些方法可以解决你的问题。这里有一个:

var myFunc = function(user, callback) {
  var allow = false;
  User.find({ where: { id: user.id},
    include: [{
      model: Plan,
      attributes: ['id', 'name']
    }]
  }).then(function(u) {
    if(!u) throw new Error("0 user not found");
      user = u.dataValues;
      var plan = user.plan.dataValues.name;
    else if (plan == "Premium") allow = true;
    callback(null, allow);
  }).catch(function(error){
    callback(error);
  });
}

那么你可以使用这个函数:

myFunc(user, function (err, allow) {
  // Do not forget to handle error
  // `allow` now could be used here
  console.log(allow);
});

最新更新