2015-05-07 51 views
2

看看下面的示例代碼,我想知道是否足以在最外面的續集任務上鍊接一個.catch(),而不是始終將其鏈接在看起來相當混亂的每個任務上。續集錯誤處理

第二個問題是有可能使.then(instance, error)包含錯誤對象,如果有的話?像貓鼬一樣,第一個參數總是err obj。所以我不需要.catch一個錯誤,但只需在.then()回調函數中處理它。

function facebookStrategy() { 
    return new FacebookStrategy({ 
    clientID: config.facebook.app_id, 
    clientSecret: config.facebook.app_secret 
    }, function (accessToken, refreshToken, profile, done) { 
    process.nextTick(function() { 
     models.User.findOrCreate({ 
     where: {email: profile.emails[0].value} 
     }).spread(function (user, created) { 
     models.UserPassport.findOrCreate({ 
      where: { 
      // TODO(tsm): check out sequelize composite keys 
      method: 'facebook', 
      social_id: profile.id 
      }, 
      defaults: { 
      method: 'facebook', 
      token: accessToken, 
      social_id: profile.id 
      } 
     }).spread(function (userPassport, created) { 
      userPassport.setUser(user).then(function() { 
      user.updateAttributes({ 
       first_name: profile.name.givenName, 
       last_name: profile.name.familyName 
      }).then(function() { 
       return done(null, user); 
      }); 
      }); 
     }).catch(function (err) { 
      console.log('Error occured: ', err); 
      return done(err); 
     }); 
     }).catch(function (err) { 
     console.log('Error occured: ', err); 
     return done(err); 
     }); 
    }) 
    }) 
} 

回答

2

通過返回承諾,您可以鏈接它。

所以,你可以這樣做

function facebookStrategy() { 
    return new FacebookStrategy({ 
     clientID: config.facebook.app_id, 
     clientSecret: config.facebook.app_secret 
    }, function (accessToken, refreshToken, profile, done) { 
     process.nextTick(function() { 
      models.User.findOrCreate({ 
       where: { 
        email: profile.emails[0].value 
       } 
      }).spread(function (user, created) { 
       return models.UserPassport.findOrCreate({ 
        where: { 
         // TODO(tsm): check out sequelize composite keys 
         method: 'facebook', 
         social_id: profile.id 
        }, 
        defaults: { 
         method: 'facebook', 
         token: accessToken, 
         social_id: profile.id 
        } 
       }).spread(function (userPassport, created) { 
        return userPassport.setUser(user).then(function() { 
         return user.updateAttributes({ 
          first_name: profile.name.givenName, 
          last_name: profile.name.familyName 
         }).then(function() { 
          return done(null, user); 
         }); 
        }); 
       }); 
      }).catch(done); 
     }); 
    }); 
} 
+0

酷,所以基本上所有sequelize查詢方法可以下到最外面的一個返回一個承諾,錯誤將泡沫。 – tsm