従来の最終引数にコールバック関数を渡して実行してもらう非同期処理は、
勝手にPromiseになったりはしません。
値.then
は単純にthen
プロパティを参照するという意味で、
Promiseインスタンスはthen
プロパティをメソッドとして所持しているので、
実行出来るというだけの話です。
js
1function hoge(cb) {
2 // もしcallbackが存在するなら実行する
3 if (cb) cb();
4}
5console.log(hoge());
6// 返り値がないのでundefined
7
8// undefinedのthenプロパティを閲覧しようとすると当然エラー
9console.log(hoge().then);
10// Uncaught TypeError: Cannot read property 'then' of undefined
11
12// 実行するとPromiseインスタンスを作って返す関数を宣言
13const piko = () => new Promise(resolve => {
14 resolve()
15})
16
17// Promiseインスタンスを受け取ったら、それにはthenメソッドは存在するよね
18console.log(piko().then);
19// ƒ then() { [native code] }
20
21piko().then(() => console.log(123));
22// 123
能書きはわかった。
で、このPassport.jsとやらはPromise対応なのか?非対応なのか?
見ていきましょう。
PromiseはES2015で追加されました。
大昔から存在し、新しいものを瞬時に取り込むNode.jsにもかなり早い段階で導入されました。
対応リストで確認すると、0.12.18
時点で多くの機能が利用可能になってるんですね。
対するPassport.jsはGitHubで公開されており、
プロジェクトの仕様はpackage.jsonを見れば分かるようになっています。
json
1 "engines": {
2 "node": ">= 0.4.0"
3 },
enginesによると動作保証しているバージョンはNode.jsの0.4系、
0.12系より大幅に昔……
あっダメっぽい!
GitHubのIssueも見つけました。
Add support promises flow #536というまんまな要望があります。
ざっと読んだ感じ、2017年からPromise対応してくれーみたいな要望があがっているようですね。
うだうだ2-3年やり取りしてて、まだクローズなければマージされたプルリクもない。
結局音沙汰なしで放置かい。
非対応確定です。
結局どうすりゃええねん
Promiseベースでやりたければラッピングするしかないでしょうね。
passport.authenticate() using a Promise instead of a Custom Callback
という質問がスタックオーバーフローに存在しています。
これの回答がコールバックを無理やりPromiseに変換するライブラリでも噛ましたら?
const {promisify} = require("es6-promisify");
はそれを目的としたライブラリの一部です。
es6というのはes2015という実装が決まるまでの仮の名前なので、
bluebirdを使ってラッピングした方が良いんじゃないですかね?
使い方はbluebird promiseみたいなワードで検索すれば出てくるんで頑張ってみてください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/25 17:17