我读了很多关于Promises的文章,我觉得我还在遗漏一些东西。这是我想要解决的问题的一个例子。
File: ad.js
// Using node.js activedirectory
class AD
{
constuctor(options){
this.ad = new ActiveDirectory(options);
}
isUserValid(user, password){
return new Promise((resolve, reject) =>{
ad.authenticate(user, password, (err, auth) ->{
if(err){
reject({ code: 500, message: 'Unknow error'});
}
if(auth){
resolve({code: 200, message: 'ok'});
}
});
)
}
}
module.exports = {
AD: AD
}
File: session.js
createSession(user, password){
var self = this;
return new Promise((resolve, reject) =>{
const ad = new AD("Required parameters");
Code: 1
const result = self._isADValid(ad, user, password);
Code: 2
self._isADValidPromise(ad, user, password)
.then(resp_ad =>{
})
.catch(err =>{
});
);
}
_isADValidPromise(ad, user, password) {
return new Promise((resolve, reject) => {
ad.isUserValid(user, password)
.then(resp_ad => {
resolv(resp_ad);
})
.catch(err => {
reject(err);
});
});
}
_isADValid(ad, user, password) {
return ad.isUserValid(user, password)
.then(resp_ad => {
return resp_ad;
})
.catch(err => {
return err;
});
}
我想要了解的是以下内容:
不应该“代码1”从_isADValid返回一个值。而是返回“Promise {pending}”。我虽然你只需要使用承诺中的then / catch? 所以函数_isADValid()调用AD函数isUserValid,它是从Promise返回的,_isADValid()包含在then / catch中,只返回结果。
使用“_isADValidPromise”的代码2可以正常运行。而且我把它包裹在一个Promise中,所以它按照我的预期行事。
如果有人可以帮助澄清代码1无效的原因
答案 0 :(得分:1)
你必须记住,Promises不会解决,直到(至少)下一个滴答(详情here)。您期望Promise同步返回,但Promise根据定义是异步的。
您的示例演示了这一点:如果您考虑一下,您对new
的调用很可能是异步的 - 请联系某个服务器以对用户进行身份验证。发明Promise是为了提供一个很好的控制流并避免回调地狱,以此方式包装异步操作。所以简而言之,只要你使用Promise,它就会异步返回。
有鉴于此,authenticate
会返回一个承诺,所以self._isADValid(ad, user, password);
自然是承诺。获得结果的唯一方法是添加result
并等待它解决,这将始终至少是未来的一个滴答。
希望有所帮助。