2016-04-27 7 views
0

私はSQLクエリを実行するjavascriptの次の部分を持っており、結果に応じて2番目のクエリを実行する必要があります。私は2番目のクエリの適切な値を反復処理するためにクロージャを使用して管理していますが、私は希望の値を返すことができませんでした。私は未定義になっています。クロージャからの戻り値は定義されていません

 db.transaction(function(tx) { 
      tx.executeSql('SELECT * FROM maintainance', [], function(tx, results){ 
       maintainance_length = results.rows.length; 
       maintanance_query = results.rows; 
       for (i = 0; i < maintanaince_length; i++) { 
        maintainance_title = maintanance_query[i].element; 
        var classAction = function(){ 
         if(maintanance_query[i].code == '0'){ 
          return 'no'; 
         }else{ 
//over here i use the closure to iterate each seperate maintainance_title value 
          (function(maintainance_title){ 
          db.transaction(function(tx) { 
          tx.executeSql('SELECT * from maintainance_history WHERE element = \''+maintainance_title+'\'', 
          [], function(tx, results){ 
           if(results.rows.length > 0 && results.rows[0].action == '1'){ 
            return 'ok'; 
           }else{ 
            return 'warn'; 
           } 
          },function(tx, error){ 
            console.log(error); 
            console.log(tx); 
          });}); 
          })(maintainance_title); 
         } 
        } 
        historyIcon = "<div class=\""+classAction()+"\"></div>"; 
       } 
       },function(tx, error){ 

       } 
      ); 
     }); 

複雑訴訟形態がclassActionが非同期であるため、私のコメントと一緒に行くの機能

+1

'classAction()'は非同期関数であり、それを同期的に呼び出そうとしています。残念なことに、 '' ok ''や '' warn''を返す場所は空に戻りますが、実際には返り値では何も行われません。 'classAction()'の一番下には 'return'もありませんので、常にundefinedを返します。 – aaronofleonard

+0

だから、私は "historyIcon ="

"関数に渡し、それぞれの戻り値がどこで発生するかを呼び出します。この方法では、各繰り返しが完了したときに呼び出されます – nikolas

+0

私は私の答えで取ったアプローチです、良い考え;) – aaronofleonard

答えて

1

ではないことを私はTHSコードOVRいくつかのバリエーションをテストしているが、それでも結果がキャッチされない例外の「未定義」になるのいずれか非同期関数のように扱わなければなりません。これは、returnがウィンドウの外に出ることを意味します!私たちは約束を使用することができますが、それははるかに重要な書き換えを必要とするでしょう。コールバックを使用して簡単に書き直すことを提案しました。 historyIconで何をしたいかによっては、これはまだ機能しない可能性があります。しかし、historyIconは適切な値に設定され、それを処理する必要がある場合は、別のコールバックが順番になることがあります。

db.transaction(function(tx) { 
    tx.executeSql('SELECT * FROM maintainance', [], function(tx, results){ 
     maintainance_length = results.rows.length; 
     maintanance_query = results.rows; 

     for (i = 0; i < maintanaince_length; i++) { 
      maintainance_title = maintanance_query[i].element; 

      var classAction = function(callback){ 
       if(maintanance_query[i].code == '0'){ 
        callback('no'); 
       } 
       else { 
        (function(maintainance_title){ 

         db.transaction(function(tx) { 
          tx.executeSql('SELECT * from maintainance_history WHERE element = \''+maintainance_title+'\'', [], 
           function(tx, results){ 
            if(results.rows.length > 0 && results.rows[0].action == '1'){ 
             callback('ok') 
            }else{ 
             callback('warn'); 
            } 
           },function(tx, error){ 
             console.log(error); 
             console.log(tx); 
           }); 
         }); 

        })(maintainance_title); 
       } 
      }; 

      classAction(function(action) { 
       historyIcon = "<div class=\""+action+"\"></div>"; 
      }); 
     } 
    },function(tx, error){ 
     // error stuff 
    }); 
}); 
+0

は、非同期呼び出しの遅延のために、より複雑になりました。ダメではなく、DOMに追加してください。 – nikolas

+1

@nikolas、DOMを操作する関数を非同期でも変更する必要があります。あなたは本質的に同期コンテキストで非同期呼び出しの結果を使用することはできません – aaronofleonard

+0

これは真です、私はコールバックのif文を追加し、予想される合計コールバックが発生したときにdomに必要な項目をすべて挿入しました:) – nikolas

関連する問題