如何。然后链,但需要从先前承诺的resolve()值 - JavaScript?

问题描述:

问题出在“后台登录检查”功能。我想.then()在“getUserByEmail”之后链接“ifUserIsDisabled”。但是我需要getUserByEmail中的“userRecord”来输入“ifUserIsDisabled”。如何。然后链,但需要从先前承诺的resolve()值 - JavaScript?

我也希望这两个函数在“backendLoginCheck”函数中共享相同的.catch。

目前代码:

function getUserByEmail(email){ 
     return new Promise(function(resolve, reject){ 
     firebase.serverAuthAdmin147th.getUserByEmail(email) 
      .then(function(userRecord) { 
       resolve(userRecord); 
      }) 
      .catch(function (error) { 
       reject({token: null, errorCode: "auth/user-not-found"}); 
      }); 
    }) 
} 

function ifUserIsDisabled(userRecord){ 
    return new Promise(function(resolve, reject){ 
     if(!userRecord.disabled){ 
      resolve(); 
     } 
     else{ 
      reject({token: null, errorCode: "auth/user-disabled"}); 
     } 
    }) 
} 

function backendLoginCheck(email, password, callback){ 
    var token = null; 
    var errorCode = null; 
    var uid = null; 
    getUserByEmail(email) 
     .then(function(userRecord){ 
      ifUserIsDisabled(userRecord); 
     }) 
     .catch(function(error){ 
      callback(error); 
     }); 
} 

期望理念:

... 
getUserByEmail(email) 
    .then(ifUserIsDisabled(userRecord)) 
    .then(nextFunction()) 
    .then(nextFunction2(uses_resolveVal_from_nextFunction)) 
    .then(nextFunctionEtc()) 
    .catch(function(error){ 
     callback(error); 
    }); 

如果我正确理解你,它看起来就像你几乎在那里。如果然后在承诺链返回另一个承诺可以通过解析值环比下滑

例如:

function firstFunction() { 
    return new Promise((resolve, reject) => { 
     if (someError) { 
      reject(firstErr) 
     } else { 
      resolve('first value') 
     } 
    }) 
} 

function secondFunction() { 
    return new Promise((resolve, reject) => { 
     if (someError) { 
      reject(secondErr) 
     } else { 
      resolve('second value') 
     } 
    }) 
} 

firstFunction() 
    .then((resolvedFirstValue) => { 
     return secondFunction() 
    }) 
    .then((resolvedSecondValue) => { 
     console.log(resolvedSecondValue) 
    }) 
    .catch((err) => { 
     // any error in the entire chain 
     console.error(err) 
    }) 
+0

完美的是我正在寻找的。没有意识到它就像“回归”一样简单 –

+0

很高兴帮助! – beardo34

应该是这样的:

getUserByEmail(email) 
.then(function(userRecord){ 
    return ifUserIsDisabled(userRecord); 
}) 
.then(nextFunction()) 
+0

不解决我的问题。我已经在“当前代码”中。我想ifUserIsDisabled拒绝也使用后端的.catchLoginCheck –

+1

如果你'返回'ifUserIsDisabled'它应该冒泡到'catch'问题。 –

+0

哎呀错过了'回报'。 –