0

次のドキュメント構造があります。

{
  "_id": "car_1234",
  "_rev": "1-9464f5d70547c255a423ff8dae653db1",
  "Tags": [
    "Audi",
    "A4",
    "black"
  ],
  "Car Brand": "Audi",
  "Model": "A4",
  "Color": "black",
  "CarDealerID": "5"
}

Tagsフィールドには、ドキュメントの情報がリストで格納されます。この構造は、このままである必要があります。ここで、ユーザーは HTML テキスト入力フィールドで車を検索することができます。a,は車間の区切りを表します。次の例を見てみましょう。

黒のアウディ、ピンクのアウディ A4

ここで、ユーザーは黒の Audi またはピンクの Audi A4 を見つけたいと考えています。データベースを介してクエリを実行する私のアプローチは、入力された単語を次の構造に分割し、サブ配列内のすべての単語 (「black」や「Audi」など) が存在する場合にデータベース内の各ドキュメント[["black", "Audi"],["pink", "Audi", "A4"]]のフィールド内を検索し、を返します。TagsCarDealerID

 ///Before this I return the word list as described
 }).then(function (wordList) {
 results = [];

 for (var i = 0; i < userWords.length; i++) {

    //Check if the object is a single word or an array of words
    if (wordList[i].constructor === Array) {

         //Recreate the words in the array as one string
         wordString = ""
         wordList[i].forEach(function (part) {
             wordString += part + " "
         })
         wordString = wordString.trim()

         //Search for the car
         car_db.search({
             query: wordString,
             fields: ["Tags"],
             include_docs: true
             }).then(function(result) {
                 result.rows.forEach(function (row) {
                    results.push(row.doc.CarDealerID)
                 })
             })

    } else {
       car_db.search({
           query: userWords[i],
           fields: ["Tags"],
           include_docs: true
           }).then(function(result) {
               result.rows.forEach(function (row) {
                  results.push(row.doc.CarDealerID)
               })
           })
    }

    return results

   }).then(function(results) {
         console.log(results)
   }).catch(function (err) {
         console.log(err)
   });

私の問題

for私の問題は、ループが終了する前に結果が返されることです。これはおそらく、これが非同期プロシージャであり、この非同期が完了するまで結果が返されるのを待つ必要があるためです。しかし、それを達成する方法がわかりません。誰かが私を助けてくれることを願っています。

4

1 に答える 1

0

Nolan Lawson のブログ (Rookie Mistake #2)のおかげで、私はそれを理解することができました。forループの代わりに、私は使用します

return Promise.all(wordList.map(function (i) {
     results = [];
     //
     //Same Code as before
     //
     //Return results inside the map function
     return results;
}));
于 2016-11-03T20:21:40.210 に答える