链接和传递承诺的结果进一步下降

时间:2017-06-25 05:58:18

标签: node.js firebase firebase-realtime-database promise chaining

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

((TextView)findViewById(R.id.company_day1)).setText("Sunday");     
((TextView)findViewById(R.id.company_day2)).setText("Monday");

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

3 个答案:

答案 0 :(得分:2)

这在功能上与您的代码相同,只是它将credentials传递到writeUserData所需的位置。而不是一个完全平坦的承诺链,你添加一个.then到createUser响应返回credentials而不是未使用(在你的代码中)来自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));

答案 1 :(得分:1)

Maaz 的Promise.all解决方案也可以使用,除非您需要从登录请求到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));

答案 2 :(得分:0)

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