2015-11-22 97 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