1

私が使用しているもの:

  • nodejs(0.6.8)
  • expressjs(2.5.2)
  • socket.io(0.8.7)
  • node-db-mysql(0.7.6)

現在、コードは正しく機能していますが、ネストされた関数のコールバックを回避する方法があるかどうか疑問に思います。

クエリ:

/************************* 
 Queries 
**************************/
var sql_states = 'SELECT ...';
var sql_colors = 'SELECT ...';
var sql_languages = 'SELECT ...';
/* ... more queries */

ネストされたクエリの実行:

/*************************     
 Run queries
**************************/
db.query(sql_states).execute(function(error, r) {
    if (error) {
        req.session.error = 'Operation failed States';
        res.redirect('back');
    }
    else if (r.length  > 0) 
    {
        for(var i in r){
            states += '<option value="'+r[i]['id_state']+'">'+r[i]['name']+'</option>';
        }

        var colors = '';

        db.query(sql_colors).execute(function(error, r) {
            if (error) {
                req.session.error = 'Operation failed Colors';
                res.redirect('back');
            }
            else if (r.length  > 0) 
            {
                for(var i in r){
                    colors += '<option value="'+r[i]['id_color']+'">'+r[i]['name']+'</option>';
                }

                var languages = '';

                db.query(sql_languages).execute(function(error, r) {
                    if (error) {
                        req.session.error = 'Operation failed Languages';
                        res.redirect('back');
                    }
                    else if (r.length  > 0) 
                    {
                        for(var i in r){
                            languages += '<option value="'+r[i]['id_language']+'">'+r[i]['name']+'</option>';
                        }
                        ...

どんな提案でも大歓迎です。

ありがとう。

4

2 に答える 2

2

このモジュールを使用して、async思いつく限りのほぼすべての非同期フロー制御シナリオをクリーンに管理できます。

于 2012-12-01T19:15:55.123 に答える
2

これは、非同期JavaScript開発の典型的な問題です。非同期関数の一種のシリアル実行パスを作成できるようにするには、中規模から大規模のプロジェクトに使用する必要のあるさまざまなソリューションがあります。

https://github.com/caolan/async

https://www.npmjs.com/package/promise

非常によく文書化されているので、私は個人的にasyncを使用しています。ネストされたコールバックは、async.each構文を使用して簡単に解決できます。

async.each(openFiles, function(file, callback) {
     // do processing for every file and return callback when async call is completed 
}, function(err){
     // execute this piece of code when all your processing is complete.
});
于 2015-06-30T14:29:08.773 に答える