问题
When trying to get multiple firebase references one after the other, only the last requests callbacks gets called.
Below I am trying to get 3 firebase references for different data
console.log('authenticating Users');
var firebaseRef1 = new Firebase('https://stckflw.firebaseio.com/Users');
firebaseRef1.authWithCustomToken('<token>',function(error, authData){
console.log('authentication callback for Users');
} );
console.log('authenticating Messages');
var firebaseRef2 = new Firebase('https://stckflw.firebaseio.com/Messages');
firebaseRef2.authWithCustomToken('<token>',function(error, authData){
console.log('authentication callback for Messages');
} );
console.log('authenticating Emails');
var firebaseRef3 = new Firebase('https://stckflw.firebaseio.com/Emails');
firebaseRef3.authWithCustomToken('<token>',function(error, authData){
console.log('authentication callback for Emails');
} );
I am seeing the log like this
authenticating Users
authenticating Messages
authenticating Emails
authentication callback for Emails
Whereas I expect to get all 3 callbacks one after another on authentication, so I expect to see logs like
authenticating Users
authenticating Messages
authenticating Emails
authentication callback for Users
authentication callback for Messages
authentication callback for Emails
Am I missing something here cause of which this happens?
I want to achieve it in such a way that all the callback gets triggered on authentication, without missing any.
I have created a example here http://jsfiddle.net/aniruddhbk/rvkz9mrt/4/
回答1:
Since authentication happens asynchronously, these calls are not executing after each other, but mostly in parallel. When you start a new authentication call it automatically cancels the existing one. Without understanding much about your use-case, you can start each Firebase in its own context/session, by passing an extra (undocumented) parameter in when you create the Firebase
reference:
console.log('authenticating Users');
var firebaseRef1 = new Firebase('https://stckflw.firebaseio.com/Users', 'Users');
firebaseRef1.authWithCustomToken('<token>',function(error, authData){
console.log('authentication callback for Users');
} );
console.log('authenticating Messages');
var firebaseRef2 = new Firebase('https://stckflw.firebaseio.com/Messages', 'Messages');
firebaseRef2.authWithCustomToken('<token>',function(error, authData){
console.log('authentication callback for Messages');
} );
console.log('authenticating Emails');
var firebaseRef3 = new Firebase('https://stckflw.firebaseio.com/Emails', 'Emails');
firebaseRef3.authWithCustomToken('<token>',function(error, authData){
console.log('authentication callback for Emails');
} );
This will allow each call to complete and gives you three concurrent authenticated sessions in one Firebase client.
authenticating Users
authenticating Messages
authenticating Emails
authentication callback for Users
authentication callback for Messages
authentication callback for Emails
As Kato said: it is probably better to not do this and find a way to combine the permissions for all three sessions into a single token/session.
来源:https://stackoverflow.com/questions/32372396/multiple-custom-authentication-requests-to-firebase-failing