3

Sqlite で Web フォームの一部を検証しようとしているときに、タイミングの問題が発生しています。

function submitForm()
{
   var isValid = validateK2();
   if(isValid)
      submitK2();
}


function validateK2()
{
    db.transaction(function(tx){
        tx.executeSql("Select * From K2", [], function(tx, result){
             if (results meet my criteria)
                  return true;
             else
                  return false;
        }, onSqlError);
    });
}

しかし、if (isValid...) コードの実行時には、validateK2 関数の実行が終了しておらず、まだ true または false を返していないため、undefined が返されます。ここで何が欠けていますか?

編集: このサイトは、従業員が書類のメニューから選択して記入できるポータルです。送信時に、1 つまたは 5 つのフォームを送信している可能性があります。したがって、@CL は正しいです。true を返してから送信するのではなく、executeSql コールバックで送信するだけでよいのです。しかし、選択したドキュメントに応じてさらに多くの検証を実行する必要があるという事実は、各ドキュメントを動的に検証し、フォームを「送信」する前にすべてのドキュメントが有効であることを確認できる動的な方法が必要であることを意味します。だからここに私がしたことがあります:

var submitFinalTimeout;
var doc1IsValid;
var doc2IsValid;
var selectedDocCount = selectedDocs.length \\selectedDocs is an array containing all the documents that have been selected and completed

function ValidateForm()
{
   submitFinalTimeout = window.setTimout(submitFinal, 3000);

   if(selectedDocs.indexOf("Doc1") != -1)
       validateDoc1();
   if(selectedDocs.indexOf("Doc2") != -1)
       validateDoc2();
}

function validateDoc1()
{
    db.transaction(function(tx){
       tx.executeSql("Select * From Doc1Data", [], function(tx, result){
         if (results meet my criteria)
            doc1IsValid = true;
            selectedDocCount--;
            if(selectedDocCount != 0)
              {
                 window.cancelTimeout(submitFinalTimeout);
                 submitFinalTimeout = window.setTimeout(submitFinal, 3000);
              }
      }, onError);
    });
}

function validateDoc2()
{
    db.transaction(function(tx){
       tx.executeSql("Select * From Doc2Data", [], function(tx, result){
         if (results meet my criteria)
            doc2IsValid = true;
            selectedDocCount--;
            if(selectedDocCount != 0)
              {
                 window.cancelTimeout(submitFinalTimeout);
                 submitFinalTimeout = window.setTimeout(submitFinal, 3000);
              }
      }, onError);
    });
}

function submitFinal()
{
   if (doc1IsValid && doc2IsValid)
       submitForm();
}
4

1 に答える 1

0

渡されtransactionexecuteSql非同期で実行される関数。

トランザクションの結果として何かを実行したい場合は、そのコールバックで実行する必要があります。return trueを呼び出しに置き換えsubmit2Kます。

于 2012-12-07T08:22:20.553 に答える