2015-11-22 66 views
0

我想通过一个承诺,护照的完成回调函数。如果我使用bluebird诺言库,我将如何去与此?蓝鸟承诺作为承诺回调不知道api

我知道有一个promisification主题,有asCallbackfromCallback但我不能从例子中得到的想法。

exports.signup = new LocalStrategy({ 
    usernameField: 'email', 
    passwordField: 'password', 
    passReqToCallback: true 
    }, 
    (req, email, password, done) => { 
    ... 
    return done(null, false, {type: 'warning', message: 'Email is in use.'}) 
    ... 
    } 
); 

编辑:

这是我想实现:

exports.signup = new LocalStrategy({ 
    usernameField: 'email', 
    passwordField: 'password', 
    passReqToCallback: true, 
    passportLocalCallback 
}); 

function passportLocalCallback(req, email, password, done) { 
    return new Pormise((resolve, reject) => { 
    return User.findOneAsync({email: email}); 
    }) 
    .then((existingUser) => { 
    if (existingUser) { 
     resolve([null, false, {type: 'warning', message: 'That email is already taken.'}]) 
    } 
    return User.generateHash(password); 
    }) 
    .then((hash) => { 
    return User.createAsync({ 
     email: email, 
     password: hash 
    }) 
    }) 
    .catch((err) => reject(err)); 
} 
+0

我不确定这是否会起作用,因为Passport要求用特定参数调用'done()'(对象表达式如果认证成功,则发送用户,或者如果不是,则为虚假)。你能详细说明你到底想做什么(例如,来自哪里的承诺)。 – robertklep

+0

@robertklep我更新了这个问题,希望它现在更清楚。我很确定这可以通过蓝鸟promisification utils来完成,但不清楚如何。 – tsm

+1

'新的Pormise((resolve,reject)=> {User.findOneAsync({email:email}); }}'肯定是错误的。不仅因为输入错误,而且因为你不能从构造函数回调中返回任何东西。 – Bergi

回答

0

我不认为你可以得到它与promisification工具的工作,主要是因为护照也有一个有效的3个参数的回调情况,这是蓝鸟不知道的(我认为)。

唯一的解决办法我能想出的时刻:

function passportLocalCallback(req, email, password, done) { 
    User.findOneAsync({ email : email }).then((existingUser) => { 
    if (existingUser) { 
     return done(null, false, {type: 'warning', message: 'That email is already taken.'}); 
    } 
    return User.generateHash(password).then((hash) => { 
     return User.createAsync({ 
     email : email, 
     password : hash 
     }) 
    }).then((user) => { 
     return done(null, user); 
    }); 
    }).catch((err) => done(err)); 
} 

编辑:使用asCallback()会缩短码了一点,但国际海事组织它不是一个整体少了很多凌乱:

function passportLocalCallback(req, email, password, done) { 
    User.findOneAsync({ email : email }).then((existingUser) => { 
    if (existingUser) { 
     return [ false, { type: 'warning', message: 'That email is already taken.' } ]; 
    } 
    return User.generateHash(password).then((hash) => { 
     return User.createAsync({ 
     email : email, 
     password : hash 
     }) 
    }); 
    }).asCallback(done, { spread : true }); 
} 

(未经测试)

+0

但这意味着我将不得不在许多情况下将回调风格与承诺混合在一起,我认为这会造成很多混乱。我希望'asCallback'的用例是为了解决像这样的情况。并且还有多个参数的扩展选项。 http://bluebirdjs.com/docs/api/ascallback.html – tsm

+0

@AttilaEgyed我编辑我的答案使用'asCallback()' – robertklep