0

関数に次のロジックが必要です。

  1. パスポートを使用して Facebook でログインし、メソッドを呼び出して Facebook ID を持つユーザーを取得します。
  2. ユーザーが存在する場合は完了です。
  3. それ以外の場合は、メソッドを呼び出して、メールでユーザーを取得します。
  4. ユーザーが存在する場合は、Facebook ID でユーザーを更新する必要があり、完了です!
  5. ユーザーが存在しない場合は、メールと Facebook ID を使用してアカウントを作成する必要があります。

たとえば、Java では次のようになります。

try {
  User user = userService.findByFacebookAccount(id);
  if(user != null) {
    done(user);
  } else {
    user = userService.findByEmail(email);
    if(user != null) {
      user.setFacebookAccount(id);
      if(userService.update(user)) {
        done(user); // Update with success
      } else {
        throws new Exception();
      }
    } else {
      user = userService.createByFacebookAccount(name, email, facebook_id);
      if(user != null) {
        done(user);
      } else {
        throws new Exception();
      }
    }
  }
} catch(Exception e) {
  done(e);
}

Promises でそれを整理するにはどうすればよいですか? ブルーバードの約束を使用して次のようにしました:

function(accessToken, refreshToken, profile, done) {
  var profileInfos = profile._json;
  userService.findByFacebookAccount(profileInfos.id).then(function(user) {
    done(null, user);                                  
  }).error(function(e) {
    return userService.findByEmail(profileInfos.email);
  }).then(function(user) {            
    user.set('facebook_account', profileInfos.id);
    return userService.update(user, ['facebook_account']);
  }).then(function(user) {
    done(null, user);
  }).error(function(e) {        
    return userService.createByFacebookAccount(profileInfos.name, profileInfos.gender, profileInfos.username, profileInfos.email, profileInfos.id);
  }).then(function(user) {
    done(null, user);                    
  }).catch(function(e) {
    done(null);
  });
}

「userService.update(user, ['facebook_account']);」を返すときだから間違っていると思います エラーをキャッチしてエラーを返す必要があり、ユーザーを作成しないでください。

sync ロジックから promise に変換する最良の方法は何ですか?

4

1 に答える 1