将 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));
我正在链接一些 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));