使用then写异步导致逻辑问题
238 AdminUser.findByName(name)
239 .then(function(model){
240 if(!model || model.passwd != passwd){
241 res.send("fail");
242 throw new GError("用户名或密码不正确");
243 }
244 return model;
245 })
246 .then(function(model){
247 status = model.updatePass(newPasswd);
248 return status;
249 });
250 })
251 .then(function(status){
252 console.log("status:"+status);
253 res.send(status);
254 })
按照本应该的逻辑,247行更改密码后,将更改是否成功的状态用变量status传回来,给251行的then,然后这个then根据status来渲染网页。
但是由于247行的数据库操作是一个耗时的异步操作,所以251行的function会在247行的数据库操作结束之前执行。结果就是status还没有获得值就return给了渲染操作(252行会打印出status:undefined)。想了几个方法都没有成功,不知道大家有什么方法能解决这个问题。
2 回复
你的代码写的很有问题,不仅冗余而且没有用对。 updatePass必须也要返回一个Promise,否则这个异步操作还没执行,下一个then方法就执行了。 所以status肯定不是预期的返回值。 还有第244行没有必要再返回一次,多加一个then,把updatePass改造下直接这样
244 return model. updatePass(newPasswd)
另外,看你的似乎用的是mongoose,如果是可以看下我的mongoomise
恩,对异步还是很不适应和熟悉。
如您所说的,直接改成
return model. updatePass(newPasswd)
结果还是一样,在updatePass还没有执行完的时候,已经执行了252行的console语句。
另外,我这儿用的是sequelize来连接mysql数据库。