代码之家  ›  专栏  ›  技术社区  ›  user1738539

将承诺的结果链接并传递给下一个承诺[副本]

  •  1
  • user1738539  · 技术社区  · 7 年前

    我正在链接一些回复承诺的请求。第一个是在某个站点上进行登录检查,返回一些凭据。然后我生成一个admin.auth()。createUser()调用。在我知道这个createUser调用成功并且登录检查成功之后,我想使用这两个从两个承诺返回的对象发出第三个请求,将信息存储在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的结果。

    3 回复  |  直到 7 年前
        1
  •  2
  •   Jaromanda X    7 年前

    这在功能上与您的代码相同,只是它通过了 credentials 在需要它的地方 writeUserData 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)-那么您不会忽略来自的响应 -这根本不会使代码变得更复杂

    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));
    
        2
  •  1
  •   Shivam    7 年前

    马兹 也可以,除非您需要从登录请求到createUser请求中的某些内容。如果是这样,那么你可以使用下面的解决方案。

    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));
    
        3
  •  0
  •   maazadeeb    7 年前

    你可以试试这个。你需要使用 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));