0

このようなスクリプトがあるとします

var a = getData();

function getData() {
 if (some_condition) { // Do this }
 else {// Do this }
 return fetchFromDB(param);
}

function fetchFromDB(param) {
 db.transaction(function (tx) { 
  tx.executeSQL("SELECT foo FROM bar WHERE column = ? ", [param], function (tx, res) {
   return res.rows.item(0).foo
  });
 });
}

問題は tx.executeSQL が非同期であるため、fetchFromDB() メソッドが呼び出し元に undefined を返す、つまり getData()、同じ undefined が main 関数に返されることです。これを回避するには、次のように fetchFromDB() に 1 つのコールバックが必要です。

tx.executeSQL("SELECT foo FROM bar WHERE column = ? ", [param], function (tx, res) {
   callBack1(res.rows.item(0).foo);
  });

getData() に値が返されるようになりましたが、コールバック 1 からデータを返すメイン関数に戻るには、ここに 1 つのコールバック 2 が必要です。このように、私が呼び出した場所に対してコールバックが必要なようです。確かに私はここで何かが欠けています! 1 つのコールバックに制限するにはどうすればよいですか?

4

1 に答える 1

0

ネストされた関数を使用してこれを実現できます

function f1() {
    function f1callback(param) {
        console.log(" callback 1 " + param);
    }
    f2(f1callback);
}

function f2(callback) {
    function f2callback(param) {
        console.log(" callback 2 " + param);
        callback(param);
    }
    f3(f2callback);
}

function f3(callback) {
    function f3callback(param) {
        console.log(" callback 3 " + param);
        callback(param);
    }
    f4(f3callback);
}

function f4(callback) {
    setTimeout(function () {
        callback("data");
    }, 1000);
}

f1();
于 2013-06-03T05:10:11.563 に答える