2016-09-20 9 views
0

には実行されません約束:Javascriptが私は約束の以下のチェーンに問題が持っているため

Parse.Promise.as().then(function() { 
     return query.first({useMasterKey: true}); 
     }).then(function(requestData) { 
      if (!requestData) { 
       return signUp(fb_ID,fb_accessToken) 
      } else { 
       return signIn(fb_ID,fb_accessToken) 
      } 
     }).then(function(userdata){ 
     if (userdata.success == "true") { 
      response.success(userdata) 
     } 
     else { 
      response.error(userdata) 
     } 
     }) 

var signIn = function(fb_ID,fb_accessToken) { 
console.log("signin!") 
var promise = new Parse.Promise(); 
var TokenStorage = Parse.Object.extend("tokenStorage"); 
var query = new Parse.Query(TokenStorage); 
query.equalTo('facebookID', fb_ID); 
query.ascending('createdAt'); 
var password; 
var username; 
var output = {}; 
var user; 
// Check if this ID has previously logged in, using the master key 
query.first({ useMasterKey: true }).then(function(tokenData) { 

    // Update the accessToken if it is different. 
    if (fb_accessToken !== tokenData.get('fb_accessToken')) { 
     console.log('1') 
     user = tokenData.get('user'); 
     user.fetch({ 
      success: function(data) { 
       username = data.get('username') 
       tokenData.set('fb_accessToken', fb_accessToken); 
       /* 
       password = new Buffer(24); 
       _.times(24, function(i) { 
       password.set(i, _.random(0, 255)); 
       password = password.toString('base64') 
       }) 
       */ 
       password = (Date.now().toString(36) + Math.random().toString(36).substr(2, 10)).toUpperCase(); 

       user.setPassword(password); 
       tokenData.set('password',password) 
       tokenData.set('username',username) 

      }   

     }).then(function(){ 
      tokenData.save(null, { useMasterKey: true }).then(function(tokenuser) { 
       user.save(); 
       return Parse.User.logIn(username, password); 
      }).then(function(data) { 
       // Return the user object. 
       output.success = true 
       output.isnewuser = false 
       output.username = username; 
       output.password = password; 
       output.fb_accessToken = fb_accessToken; 
       //return Parse.Promise.as(output); 
       promise.resolve(output) 
       //return promise 
      }); 
     }) 

    } else { 
     console.log('2') 
     Parse.Promise.as().then(function() { 
      username = tokenData.get('username'); 
      password = tokenData.get('password'); 
     }).then(function(){ 
      Parse.User.logIn(username, password) 
      .then(function(data) { 
       // Return the user object 
       output.success = true 
       output.isnewuser = false 
       output.username = username; 
       output.password = password; 
       output.fb_accessToken = fb_accessToken; 
       console.log('oo'+JSON.stringify(output)) 
       //return Parse.Promise.as(output); 
       promise.resolve(output) 

      }); 
     }) 

    } 
}) 
return promise 
} 

var signUp = function(fb_ID,fb_accessToken) { 
console.log("signup") 
ExtendFacebookAccessToken(fb_accessToken).then(function(new_fb_accessToken){ 
     var TokenStorage = Parse.Object.extend("tokenStorage"); 
     var restrictedAcl = new Parse.ACL(); 
     restrictedAcl.setPublicReadAccess(false); 
     restrictedAcl.setPublicWriteAccess(false); 
     var user = new Parse.User(); 

     // Generate a random username and password. 
     /*var username = new Buffer(24); 
     var password = new Buffer(24); 
     _.times(24, function(i) { 
      username.set(i, _.random(0, 255)); 
      password.set(i, _.random(0, 255)); 
     }); 
     */ 
     var username = (Date.now().toString(36) + Math.random().toString(36).substr(2, 10)).toUpperCase(); 
     var password = (Date.now().toString(36) + Math.random().toString(36).substr(2, 10)).toUpperCase(); 

     user.set("username", username.toString('base64')); 
     user.set("password", password.toString('base64')); 
     // Sign up the new User 
     return user.signUp().then(function(user) { 
      console.log('user'+JSON.stringify(user)) 
      // create a new TokenStorage object to store the user+GitHub association. 
      var ts = new TokenStorage(); 
      ts.set('facebookID', fb_ID); 
      ts.set('fb_accessToken', new_fb_accessToken); 
      ts.set('username',username) 
      ts.set('password',password) 
      ts.set('user', user); 

      ts.setACL(restrictedAcl); 
      // Use the master key because TokenStorage objects should be protected. 
      return ts.save(null, { useMasterKey: true }); 
     }).then(function(tokenStorage) { 
      var output 
      var promise = new Parse.Promise(); 
      output.username = username; 
      output.password = password; 
      output.process = "signup"; 
      output.fb_accessToken = new_fb_accessToken; 
      output.success = true; 
      output.isnewuser = true 
      promise.resolve(output); 
      return promise 
     }); 
    }) 
} 

両方新規アカウントをしてサインインが約束を返しますが、問題は、最後の(「その後、(機能(ユーザデータ) ...)は、SignUpとSignInが 'userdata'を返す前に実行されます。私は、SignUpまたはSignIn関数の前のリターンが、最後の約束を強制してユーザーデータを待つのに十分だと思っていました。 ?

+0

新規アカウントとサインインとは何ですか?彼らが「約束を返す」ことは明らかではありません。 – estus

+0

「SignUpとSignInの両方が約束を返す」場合、あなたのコードは間違いなくあなたが考えるべきことを行うように見えます - 実際にそれらの関数が約束を返すことを確認しましたか? –

+0

@estus - query.firstが約束を返すことも明白ではない –

答えて

0

あなたのお申し込み方法は約束を返さない代わりに、すぐに解決するundefinedを得る可能性が最も高いです

変更:

var signUp = function(fb_ID,fb_accessToken) { 
console.log("signup") 
ExtendFacebookAccessToken(fb_accessToken).then(function(new_fb_accessToken) 

へ:

var signUp = function(fb_ID,fb_accessToken) { 
console.log("signup") 
return ExtendFacebookAccessToken(fb_accessToken).then(function(new_fb_accessToken) 

としてください、あなたのコードをインデントしてください:(

関連する問題