将 promise 的结果链接并传递到进一步向下的 promise

Chaining and passing result of promise to a promise further down

我正在链接一些 return 承诺的请求。第一个是在某些网站上进行登录检查,return 返回一些凭据。然后我进行 admin.auth().createUser() 调用。在我知道这个 createUser 调用成功并且我知道登录检查成功之后,我想使用这两个对象 returned 从两个承诺中发出第三个请求以将信息存储在 firebase 实时数据库中。我只是不知道如何将这两个结果传递给最终的承诺。这是一些代码。

login(siteUser, sitePass)
   .then(credentials => {
      return admin.auth().createUser({
         'email': email,
         'emailVerified': false,
         'password': password,
         'displayName': username
       })
    })
    .then(userData => {
       return writeUserData(userData, credentials); // I need to pass credentials here but I don't know how.
    })
    .then(() => res.status(200).send('success'))
    .catch(err => res.status(500).send(err));

我需要在 createUser() 解析后将第一个承诺的结果传递给 writeUserData。

你可以试试这个。您需要使用 Promise.all

const loginPromise = login(siteUser, sitePass);
const createUserPromise = admin.auth().createUser({
  'email': email,
  'emailVerified': false,
  'password': password,
  'displayName': username
})

Promise.all([loginPromise, createUserPromise]).then(result => {
    // Then use result array
    return writeUserData(result[1], result[0]);
  }).then(() => res.status(200).send('success'))
  .catch(err => res.status(500).send(err));

Maaz 的 Promise.all 解决方案也可以,除非您需要从登录请求到 createUser 的某些内容 request.If 就是这种情况,那么您可以使用下面的解决方案。

login(siteUser, sitePass)
.then(credentials => {
  return admin.auth().createUser({
     'email': email,
     'emailVerified': false,
     'password': password,
     'displayName': username
   })
  .then(createUserRes => ({createUserRes, credentials})
})
.then(userData => {
    // You can now access both the createUserRes & credentials as
    // userData.credentials or userData.createUserRes
   return writeUserData(userRecord, credentials); // I need to pass credentials here but I don't know how.
})
.then(() => res.status(200).send('success'))
.catch(err => res.status(500).send(err));

这在功能上等同于您的代码,只是它将 credentials 传递到 writeUserData 需要的地方。而不是一个完全平坦的承诺链,你添加一个 .then 到 createUser 响应 return credentials 而不是 unused (在你的代码中)来自 createUser

的回复
login(siteUser, sitePass)
.then(credentials => 
    admin.auth().createUser({
        email, 
        emailVerified:false, 
        password, 
        displayName: username
    })
    .then(userData => credentials)
)
.then(credentials => writeUserData(userRecord, credentials))
.then(() => res.status(200).send('success'))
.catch(err => res.status(500).send(err));

但是,如果您的代码有误并且

.then(userData => {
   return writeUserData(userRecord, credentials); // I need to pass credentials here but I don't know how.
})

应该是

.then(userData => {
   return writeUserData(userData, credentials); // I need to pass credentials here but I don't know how.
})

(即 userRecord 应该是 userData)——那么你就不会忽略来自 createUser 的响应——这根本不会使代码复杂得多

login(siteUser, sitePass)
.then(credentials => 
    admin.auth().createUser({
        email, 
        emailVerified:false, 
        password, 
        displayName: username
    })
    .then(userData => ({userData, credentials}))
)
.then(({userData, credentials}) => writeUserData(userData, credentials))
.then(() => res.status(200).send('success'))
.catch(err => res.status(500).send(err));