把我的头缠在Promise身边然后

时间:2017-03-06 20:56:40

标签: node.js promise

我读了很多关于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无效的原因

1 个答案:

答案 0 :(得分:1)

你必须记住,Promises不会解决,直到(至少)下一个滴答(详情here)。您期望Promise同步返回,但Promise根据定义是异步的。

您的示例演示了这一点:如果您考虑一下,您对new的调用很可能是异步的 - 请联系某个服务器以对用户进行身份验证。发明Promise是为了提供一个很好的控制流并避免回调地狱,以此方式包装异步操作。所以简而言之,只要你使用Promise,它就会异步返回。

有鉴于此,authenticate会返回一个承诺,所以self._isADValid(ad, user, password);自然是承诺。获得结果的唯一方法是添加result并等待它解决,这将始终至少是未来的一个滴答。

希望有所帮助。