1

次のコードがあります。

function getRetailerName(retailerID) {
    var retailerName;
    db.transaction(function retName(qry) {
        qry.executeSql("SELECT retailerName FROM retailers WHERE token = '" + retailerID + "' ", [], function (tx, results1) {
            var len1 = results1.rows.length;
            var retailerName;
            for (var i1 = 0; i1 < len1; i1++) {
                retailerName = results1.rows.item(i1).retailerName;
                //alert(results1.rows.item(i1).retailerName);
            }
        });
        return retailerName;
    });
    alert(retName());
}

内部関数から値を取得しようとしていますが、retName()最終的にデータベースから値を取得するために呼び出しますが、定義されgetRetailerName()ていないエラーが表示され続けますか?retName

ここは色々試しましたが、

4

2 に答える 2

3

非同期なので、そのようにすることはできません。関数から戻るまでに、クエリは完了していません。代わりに、コールバックを渡して実行します。

function getRetailerName(retailerID, callback) {
    var retailerName;
    db.transaction(function retName(qry) {
        qry.executeSql("SELECT retailerName FROM retailers WHERE token = '" + retailerID + "' ", [], function (tx, results1) {
            var len1 = results1.rows.length;
            var retailerName;
            for (var i1 = 0; i1 < len1; i1++) {
                retailerName = results1.rows.item(i1).retailerName;
                callback(retailerName);
            }
        });
    });
}

getRetailerName(1, function(name) {
    alert(name);
});
于 2013-02-27T11:30:02.747 に答える
1

できません (retName名前付きの関数式はその内部でのみ使用できるため)。また、これを実行しようとしないでください (関数が非同期であり、機能しないため)。代わりに、コールバックを使用します。

function getRetailerName(retailerID, callback) {
    var retailerName;
    db.transaction(function retName(qry) {
        qry.executeSql("SELECT retailerName FROM retailers WHERE token = '" + retailerID + "' ", [], function (tx, results1) {
            var len1 = results1.rows.length;
            for (var i1 = 0; i1 < len1; i1++) {;
                callback(results1.rows.item(i1).retailerName);
            }
        });
    });
}

getRetailerName(1, alert.bind(window));
于 2013-02-27T11:31:26.337 に答える