私はしばらくの間、非同期ウォーターフォール(非同期ライブラリ)関数(コードDRYを維持する)から関数を抽象化するための良い解決策を見つけようとしていましたが、 cb
が定義されていないと言っています。また、this
をbind
に渡すと、async
が定義された関数がスコープであり、cb
も渡します。 最終的に、私は解決しました(cb
を関数としてthis
オブジェクトに追加しました)、少しばかり見えますが、おそらくもっと良い方法があります。任意の提案?:Async Waterfallを使用してコールバック関数をバインドする
// registerController.js
const async = require('async');
const registerService = require('../services/register');
// Api endpoint code
...
// is there a better way than (this.cb = cb)
let callbackHandler = (err, res) => {
if (err) this.cb(err);
this.cb(null, res);
};
// asynchronously perform registration
async.waterfall([
(cb) => {
registerService.createAccount(username, email, callbackHandler.bind(this.cb = cb));
},
(res, cb) => {
registerService.doSomethingElse(domain, callbackHandler.bind(this.cb = cb);
},
....
// registerService.js
module.exports = {
createAccount: (username, email, callback) => {
httpService.request({
host: myHost,
method: 'POST',
path: '/api/signup',
body: {
username,
email
}
}).then((res) => {
return callback(null, res);
}).catch((err) => {
return callback(err);
});
},
...
}
注:ユニットテストの目的とリーンコントローラのServicesファイルにリファクタリングコード(MVCのアプローチを取って)
これはうんざりですが、うまくいかないことがあります。もし私が試してみたので、callbackHandler.bind({cb:cb}) ' – Bergi
@Bergiを実行したいと思うかもしれませんが、 – timhc22