2015-01-09 21 views
5

async.autoの1つのタスクから別のタスクへの結果のロジックと混乱します。たとえば、次のコードロジックでは、task1のモデルにいくつかのデータを追加しました。最初はinitialtaskの出力で、finalTaskのモデルに追加されたデータはresults.initialTask1に反映されています。 task2に同様に追加されたデータは、results.initialTask1finalTaskに反映されます。results.initialTask1のすべて、results.task1[0]results.task2[0]をまとめるとasync.autoのタスクの結果

results.task3[0]finalTaskに同じです。これはasync.autoの論理ですか?または、それはtask1のモデルに何らかの変更を引き起こすC++のポインタによる参照のようなものですか?initialTaskのモデルにも反映されていますか?

async.auto({ 
    initialTask: function(callback) { 
     //Do some operations 
     callback(null, name, initialModels); 
    }, 
    task1: ['initialTask', function(callback, results) { 
     var models = results.initialTask[1]; 
     //Add some more data to models 
     callback(null, models); 
    }], 
    task2: ['initialTask', function(callback, results) { 
     var models = results.initialTask[1]; 
     //Add some more data to models 
     callback(null, models); 
    }], 
    task3: ['initialTask', function(callback, results) { 
     var models = results.initialTask[1]; 
     //Add some more data to models 
     callback(null, models); 
    }], 
    finalTask: ['task1', 'task2', 'task3', function(callback, results) { 
     //Here the followings are the same: results.initialTask[1], results.task1[0], results.task2[0], results.task3[0]        
    }] 
}); 

私はそれがロジックかどうかを確認するのに役立つ答えを探していますか?私は必ずしも公式の文書を探しているとは限らない。

+0

応答を返す私は、私はそれが論理かを確認することができます任意の答えを探していますか?私は必ずしも公式の文書を探しているとは限りません... –

+0

は、最初の引数または結果としてコールバックします。ドキュメントごとに、結果は最初のパラメータです – Abhijeet

答えて

6

これは予想される動作です。基本的にasync.autoは、必要と思われる順にすべての機能を実行します。したがって、あなたの場合はinitialTaskが最初に呼び出されます。その後、task1,task2、およびtask3が並行して呼び出されます。最後にfinalTaskが呼び出されます。すべての値が同じ理由は、JavaScriptのcall-by-sharingに関連しています。つまり、関数パラメータ自体を変更すると、パラメータに入力された項目には影響しません。パラメータの内部を変更すると、その項目まで持ち越されます。

詳細情報here

0

async.autoが非同期のLibによって提供される機能はAsync.autoで3つのフィールド 1タスク -2-同時実行3-コールバック

を有する.IT非常に有用かつ強力で、各関数は、に依存します最初の関数以外の親関数、関数の実行中にエラーが発生した場合、それらの子関数またはそれ以下の関数はそれ以上実行されず、コールバックでエラーが発生し、メインコールバックはエラー

1-タスク: - オブジェクト 2並行性: - オプションです並行して実行できるタスクの最大数を決定する整数。デフォルトでは、できるだけ多く。 、3-コールバック: -

exapmle-

AnyService.prototype.forgetPassword = function (res, email, isMobile, callback) { 
    Logger.info("In AnyService service forgetPassword email...", email); 
    db.User.findOne({ 
     email: email.toLowerCase(), 
     deleted: false 
    }, function (err, user) { 
     if (!user) { 
      configurationHolder.responseHandler(res, null, configurationHolder.LoginMessage.registerFirst, true, 403) 
     } else { 
      async.auto({ 
       token: function (next, results) { 
        return gereratePasswordToken(next, email, user, isMobile); 
       }, 
       sendMail: ['token', function (next, result) { 
        return SendMailService.prototype.forgetPasswordMail(next, result.token, email, user.fullName); 
        }] 
      }, function (err, result) { 
       if (err == null && result != null) { 
        configurationHolder.ResponseUtil.responseHandler(res, null,  configurationHolder.LoginMessage.forgotPassword, false, 200) 
       } else { 
        callback(new Error(configurationHolder.errorMessage.oops)) 
       } 
      }) 
     } 
    }); 
    } 
関連する問題