2017-01-29 11 views
0

私はJavaScriptを初めて使いました。私は以下のようにしています。私はリストを反復し、リスト内の項目に依存するデータベース呼び出しを行いたい。明らかに、呼び出しが非同期であるため、forループが終了するまでに呼び出しが戻ってこないので、リストは空です。非同期呼び出しでforループの配列を作成する

c#では、データベース呼び出しを待つことができ、うまくいきます。私はJavaScriptで同様のアプローチを見つけることを試みてきましたが、私はJavaScriptでこれを行うには近代的な方法は、になり、私のデータベース

答えて

1

としてSQLiteのを使用しています多くの幸運

exports.methodName = (req, res) => { 

    var itemsToReturn = [] 

    for (let item of list) { 
     db.all(sql), (err, rows) => { 
      itemsToReturn.push(rows) 
     } 
    } 

    res.json(itemsToReturn) 
} 

を持っていませんよ(表示するコールバックインターフェイスではなく)約束のインターフェイスを使用または作成してから、Promise.all()を使用して、すべての非同期処理がいつ完了するかを知ることができます。あなたのデータベースが何であるかは言わないので、あなたのデータベースがすでに有望なインターフェースを持っているかどうかについては何の助けもできません。

exports.methodName = (req, res) => { 

    let itemsToReturn = []; 
    let cntr = 0; 
    for (let [index, item] of list.entries()) { 
     db.all(sql), (err, rows) => { 
      if (err) { 
       // insert error handling here 
      } else { 
       itemsToReturn[index] = rows; 
       ++cntr; 
       if (cntr === list.length) { 
        res.json(itemsToReturn); 
       } 
      } 
     } 
    } 
} 

あなたがdb.allPromise()と呼ばれるデータベースへの約束のインタフェースを持っていたと仮定すると、あなたはこのような何かを行うことができます:ここで

listを想定して物事のマニュアルの方法が配列だ

exports.methodName = (req, res) => { 

    Promise.all(list.map(item => { 
     return db.all(someSql); 
    })).then(results => { 
     res.json(results); 
    }).catch(err => { 
     res.sendStatus(500); 
    }); 
} 
+0

感謝:)私はこれを行って、どうすればいいのか教えてください。 – Ralt

+0

@Ralt - 複数の非同期操作を管理するより現代的な方法である約束をどのように働かせるかの例を追加しました。 – jfriend00

+0

@Ralt - SQLiteのいくつかのバージョンのようですが、 'db.all()'はすでに約束を返していますので、私の2番目の実装を使うことができます。 – jfriend00

関連する問題