質問: 'SELECT * FROM foo'; conn.query(sql, (err, data) => { conn.end(); if (err) throw err; // SQLの結果をpushで配列にする async.eachSeries(data, (hoge, callback) => { arr.push(hoge.id); return callback(); }); return next(null, arr); }); } ], (err, arr) => { if (err) throw err; console.log('asyncの中:', arr); // [ 80, 81, 86, 87, 88, 89, 91, 17, 31, 32, 33 ] }); console.log('asyncの外:', arr) // [] ``` ``` asyncの外: [] asyncの中: [ 80, 81, 86, 87, 88, 89, 91, 17, 31, 32, 33 ] ``` のようなイメージとなります(当たり前ですが)。 結果arrをwaterfallの外に出す方法はないでしょうか。
回答: 回答を下さった皆様、ありがとうございました。 正解でなくてもヒントにはなりました。 実際のコードは非常に複雑で長いのでここでは紹介出来かねますが、うまくいかなかった原因はコールバック関数の抜けとか、位置が違うという理由でした。 なので上記のコードがfunctionの中に入っていた場合、きちんとarrの中に値は入ってきます。 以下、正しいコードの例となります。 ``` 'use strict'; const async = require('async'); let hoge = [0, 1, 2, 3, 4]; let foo = []; let main = () => { async.waterfall([ (next) => { async.eachSeries(hoge, (h, callback) => { sub(h, (t) => { foo.push(t); return callback(); // このcallbackの位置が違っていた }); }, (err) => { // ここから return next(null); }); // ここまでが抜けていた } ], (err) => { if (err) throw err; console.log(foo); }); } let sub = (i, callback) => { let e = i + 1; return callback(e); } main(); ``` 省略しちゃいましたが、実際にはasync.eachSeriesの中にMySQLの結果を入れています。 正しく書けば、ここでいうfooはきちんと表示されます。 コールバックの書き忘れや書く位置が違うミスが多いです。 エラーを出してくれるツールでもあればいいのですが。。。