如何 .then 链接但需要来自上一个承诺的 resolve() 值 - javascript?



问题出在"backendLoginCheck"函数上。我想在"getUserByEmail"之后链接"ifUserIsDisabled"。但是我需要getUserByEmail中的"userRecord"来输入"ifUserIsDisabled"。

我还希望这两个函数在"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);
    });

如果我理解正确的话,看起来你快到了。如果承诺中的 then 链返回另一个承诺,则可以将解析的值沿链向下传递

例如:

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)
  })

应该是这样的:

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

最新更新