使用then写异步导致逻辑问题
发布于 10 年前 作者 telnetning 4287 次浏览 最后一次编辑是 8 年前
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数据库。

回到顶部