2017-03-06 64 views
-2

我已阅读了许多关于Promise的文章,并且觉得我仍然缺少一些东西。这里是我试图包裹头部的一个例子。将我的头围绕Promise,然后

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()正在调用AD函数isUserValid,该函数从Promise返回并且_isADValid()被封装在只返回结果的then/catch中。

使用“_isADValidPromise”的代码2没有任何问题。我得到它包裹在一个承诺,所以它做我的预期。

如果有人可以帮助解释,为什么代码1不工作

+0

你有错字:'''resolve''',而不是'''resolv''' – hya

+0

谢谢我修复了它。一样的问题。我只是在stackoverflow上输入错误 – adviner

+0

另外,它看起来像'ad.authenticate(...)'应该是'this.ad.authentication(...)'。 – jfriend00

回答

1

你要记住,承诺不解决,直到(至少)一个信用(详情here)。您期待Promise同步返回,但Promise根据定义是异步的。

您的示例演示了这一点:如果您仔细考虑,您拨打authenticate的电话很可能是异步的 - 向某个服务器提供以验证用户身份。发明承诺是为了包装异步操作,例如提供良好的控制流并避免回调地狱。总而言之,无论何时使用Promise,它都会异步返回。

在这种情况下,self._isADValid(ad, user, password);返回一个承诺,所以自然,result是一个承诺。获得结果的唯一方法是添加一个.then()并等待它解决,这将始终至少在未来一次打勾。

希望有所帮助。

+0

以你写的和做出更多的例子来澄清帮助我澄清它。感谢您的答复 – adviner