【问题标题】:Wrapping my head around Promise and then把我的头绕在 Promise 周围,然后
【发布时间】:2017-07-26 21:34:31
【问题描述】:

我已经阅读了很多关于 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}”。我认为您只需要使用来自 Promise 的 then/catch 吗? 所以函数 _isADValid() 正在调用从 Promise 返回的 AD 函数 isUserValid,而 _isADValid() 被包装在一个 then/catch 中,它只返回结果。

使用“_isADValidPromise”的代码 2 可以正常工作。而且我知道它包含在 Promise 中,所以它按照我的预期进行。

如果有人可以帮助澄清为什么 Code 1 不起作用

【问题讨论】:

  • 你有错字:resolve,不是resolv
  • 谢谢我修好了。同样的问题。我只是在 stackoverflow 上输入错误
  • 另外,看起来ad.authenticate(...) 应该是this.ad.authentication(...)

标签: node.js promise


【解决方案1】:

您必须记住,Promise 直到(至少)下一个刻度才会解析(详情 here)。您希望 Promise 同步返回,但 Promise 的定义是异步的。

您的示例证明了这一点:如果您考虑一下,您对authenticate 的调用很可能是异步的 - 到达某个服务器以对用户进行身份验证。 Promise 被发明来以一种提供良好控制流并避免回调地狱的方式包装异步操作,例如这个。所以简而言之,任何时候你使用 Promise,它都会异步返回。

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

希望对您有所帮助。

【讨论】:

  • 拿你写的东西并做更多的例子来澄清帮助我澄清它。感谢您的回复
猜你喜欢
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多