承诺不等待之前的陈述完成。

时间:2016-07-28 18:54:45

标签: node.js promise

我正在尝试从一个表单中发布到/ user / create路由数据,这些数据一切正常,然后逐个检查数据是否有效,在某些情况下是数据库中唯一的。这是我用来检查注册表单上输入的用户和电子邮件地址。

该函数似乎正常查询,但最后,我收集的错误消息的console.log只收集第一个条目。

// Check if variable is already is available or not
var existsInDatabase = function(field, value){

  var deferred = Q.defer();
  var query = {};
  var errorMessage = {};

  query[field] = value;

  User.find(query, function(err, docs){
    // If it finds it, then set a message for already existing
    if(docs){
        errorMessage = {'type': 'alert', 'body': value + ' already exists in the database.'}
        deferred.resolve(errorMessage);
    } else {
        deferred.reject( value + ' was not found in the database');
    }

  });
  return deferred.promise;
};

我在这里检查密码是否匹配。

var doPasswordsMatch = function(password, confirmed){
  var deferred = Q.defer();

  console.log('Values passed into doPasswordsMatch() function:', password + ' ' + confirmed);

  if(password !== confirmed){
    errorMessage = {'type': 'alert', 'body': 'The two passwords you entered do not match'};
    deferred.resolve(errorMessage);
  };

  return deferred.promise;
}

这是我使用.then链接的路线。

router.post('/user/create', function(req, res){

  var errorMessages = [];

  existsInDatabase('userName', req.body.username)
    .then(function(errorMessage){ if (errorMessage) { errorMessages.push(errorMessage) } })
    .then(existsInDatabase('userEmail', req.body.email))
    .then(function(errorMessage){ if (errorMessage) { errorMessages.push(errorMessage) } })
    .then(doPasswordsMatch(req.body.password, req.body.confirmedPassword))
    .then(function(errorMessage){ if (errorMessage) { errorMessages.push(errorMessage) } })
    .then(function(){ console.log(errorMessages); });

});

我想我正在努力的是.then的链接以及如何阻止某些东西触发,除非它之前的所有内容都已完成。

1 个答案:

答案 0 :(得分:1)

then()将函数作为参数(full specification),但您传递的是第2个和第4个.then()的承诺。如果你将它们包装在匿名函数中,它应该可以工作。

...
.then(function() { return existsInDatabase('userEmail', req.body.email); })
...
.then(function() { return doPasswordsMatch(req.body.password, req.body.confirmedPassword); })
...

return因此existsInDatabase()doPasswordsMatch()返回的承诺已经解决,然后转到下一个then()

但是,您可能需要重新考虑逻辑的设置方式。目前的方式是,如果密码匹配,则永远不会调用下一个.then,逻辑就会卡住。