将承诺的结果链接和传递到进一步向下的承诺



我正在链接一些返回承诺的请求。第一个是某个站点上的登录检查,该检查会返回一些凭据。然后我做了一个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() 解析后传递第一个承诺写入用户数据的结果。

这在功能上等同于您的代码,只是它会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));

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

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

最新更新