どのバージョンの非同期を使用していますか?
2.6.1
どの環境で問題が発生しましたか(ノードバージョン/ブラウザバージョン)
8.11.3
あなたは何をした?
fileObjが外部から供給されると仮定します。
async.auto({
download: (downloadCB) => {
if (fileObj) {
fs.writeFile(__dirname + ‘fileNew.txt’, fileObj.content, 'base64', function (err) {
if (err){
return downloadCB(err);
}
return downloadCB(null , fileObj.generatedFileName); // works fine
});
} else {
let err = new Error('File not found');
return downloadCB(err);
}
},
collectData: ['download', async (results, collectCB) => {
console.log(typeof collectCB); // prints undefined
console.log(typeof results); // prints correct object
let res = await anHttpRequest();
if (res.response && res.response.statusCode == 200) {
return collectCB(null , 'fileCombined.txt'); // This is where the ISSUE happens
}
else if(res.response.statusCode >= 300) {
return collectCB(new Error('Request failed inside async-auto'));
}
}],
filterData: ['collectData', (results, filterCB) => {
doFilter(results.collectData, filterCB);
}],
})
何が起こると思いましたか?
collectDataが実行を終了した後、filterDataはcollectCB関数内で渡されたパラメーターの実行を開始する必要があります
実際の結果はどうでしたか?
TypeError:collectCBは関数ではありません。
同じコードはバージョン2.0.1でも正常に実行されますが、2.6.1にアップグレードすると機能しなくなり、重要になります。 回避策もありがたいです。
async
関数の扱いreturn
(またはthrow
エラー)。
はい、StackOverflowから同じことを学び、将来誰かがこれに遭遇した場合に備えて、ここに同じものへの参照を投稿します: Using-async-await-inside-async-auto-chain
これは、関数が非同期の場合、コールバックを呼び出さずに値を返す必要があるasync.parallelにも当てはまります。 これは、ドキュメントと例に追加する必要があります。
async.parallel({
// NOTE: for async functions just return value or throw error
// don't use the callback
dates: async function(callback) {
var rr = await getDates(dbName, r.indi, idx);
return rr;
},
sdates: async function(callback) {
var rr = await getDates(dbName, r.spouse, idx);
return rr;
},
cdates: async function(callback) {
var rr = await getDates(dbName, r.cindi, idx);
return rr;
}
},
function(err, results) {
console.log(results);
});
ドキュメント内の多くの例を書き直して、より多くのasync / awaitを使用し、今できることを強調したいと思います。
このパッケージの機能以上に、ドキュメントが必要です。 将来的にもっと多くの例を見るのは素晴らしいことです
最も参考になるコメント
async
関数の扱いreturn
(またはthrow
エラー)。