【发布时间】:2015-11-07 16:07:36
【问题描述】:
promise 上的 then() 方法返回一个 promise。 Promise 可以处于以下三种状态之一:挂起、已完成或已拒绝。但是,在创建承诺时,当您希望您的承诺被履行或拒绝时,您有一个已解决和被拒绝的方法可以调用。我不知道如何在 then() 方法中的函数上使用这些方法。当我尝试在 then() 链中间使用带有回调的普通异步函数时,这给我带来了问题。以这段代码为例。
User.findOne({
where: {
email: email
}
}).then(function(user){
if(user){
return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
}else{
var user = User.build({ email: email });
console.log("ONE");
User.generateHash(password, function(err, hash){
console.log("TWO");
if(err){
return done(err);
}else{
user.password = hash;
var newUser = user.save();
return newUser;
}
})
}
}, function(err){
console.log("ERROR: ", err);
}).then(function(newUser){
console.log("THREE");
return done(null, newUser);
}, function(err){
console.log("USER NOT CREATED: ", err);
});
在这种情况下,User.findOne() 返回一个承诺。现在控制台将打印一三二。一旦调用异步,就会调用第二个 then 语句。有没有办法在我通知它已解决之前不调用第二个 then 语句。
(我知道这将是修复几种不同方式的简单代码,我更好奇为什么以及何时实现第一个语句返回的 then 承诺。)
【问题讨论】:
-
“有没有办法在我通知它已解决之前不调用第二个 then 语句”
js的哪一部分引用? ,初始.then()?,done()叫什么? “在 then() 方法中找不到如何在函数上使用这些方法” 从初始调用返回的承诺User.findOne已经实现或拒绝;可以在初始.then()内创建一个新的Promise
标签: javascript asynchronous promise bluebird