Async: async.autoチェーン内でasync / awaitを使用すると、TypeErrorが発生します:コールバックは関数ではありません

作成日 2018年09月24日  ·  5コメント  ·  ソース: caolan/async

どのバージョンの非同期を使用していますか?
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にアップグレードすると機能しなくなり、重要になります。 回避策もありがたいです。

docs question

最も参考になるコメント

async関数の扱いreturn (またはthrowエラー)。

全てのコメント5件

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を使用し、今できることを強調したいと思います。

このパッケージの機能以上に、ドキュメントが必要です。 将来的にもっと多くの例を見るのは素晴らしいことです

このページは役に立ちましたか?
0 / 5 - 0 評価