2

いくつかの基本的な非同期プログラミングの概念に頭を悩ませようとしています。

今のところ、基本的に 2 つの関数があります。とりあえず、getOne と getAll と呼びましょう。getAll は基本的に一連のループを実行し、getOne を呼び出して、それをハッシュにマップし、チェーンに送り返します。これは基本的に、コーヒースクリプトで私が持っているものです:

getOne = (key, callback) ->
    try
        # find object referenced by key
        object = "blah blah"
        callback(null, object)
    catch(error)
        callback(error, null)

getAll = (keys, callback) ->
    results = {}
    try
        count = keys.length
        for i, key of keys
            count--
            getOne key, (err, result) ->
                if(err)
                   # do something
                else
                   results[key] = result
                if count is 0
                   callback "", results
    catch
        callback error, results

上記のコードは基本的に、キーが期待されるデータと一致するとは限らないハッシュを出力します。これは、for ループが非同期処理される方法で期待されます。ただし、ループをブロックせず、並列処理を維持する代わりに、すべてを連続して処理するソリューションを思い付くことができないようです。

私は何が欠けていますか?

4

2 に答える 2

3

あなたが書いたコードについて本質的に非同期なものは何もありません。getOneコールバックの実行に時間がかかることが心配な場合は、いくつかのオプションがあります。

  • 非同期ライブラリを使用する
  • process.nextTickforループの各反復の実行を延期するために使用します

最初のオプションは間違いなく簡単です。

2 番目のオプションでは、 getAll 関数を ( を使用する代わりに) 再帰関数として書き直し、for再帰サブコールを でラップしprocess.nextTickます。

この記事は、これprocess.nextTickを達成するために使用する方法を理解するのにかなり役立ちます: process.nextTick() について理解する

于 2012-07-23T19:05:32.630 に答える
2

ライブラリを使用するasyncと、次のように簡単になります。

getAll = (keys, callback) ->
  funcs = {}
  keys.forEach (key) => funcs[key] = (_callback) =>
    getOne key, _callback
  async.parallel funcs, callback
于 2012-07-23T19:37:42.800 に答える