如何从嵌套的jquery函数返回?

时间:2013-07-16 19:12:18

标签: javascript jquery

我有以下功能:

function query(db, querystr){

    var resultSet;

    db.transaction(function(tx){

        tx.executeSql(querystr, [], function(tx, results){


            console.log("ROWS ---> "+results.rows);

            resultSet = results.rows;

        }, dbError);

    }, dbError, dbSuccess);

    return resultSet;

}

如何在main函数中获得results.rows以便我可以返回调用者?

假设调用者执行以下操作: var result_rows = query(db, 'select 1 from dual');

如何确保result_rows从tx.executeSql嵌套函数中获取results.rows值?我在这个例子中的方式是调用者未定义。

谢谢你, TS

2 个答案:

答案 0 :(得分:0)

尝试这样的事情。将回调函数传递给query()函数,并在执行executeSql函数后调用它。

function query("ss","querystr" function (data){ 
//data contains  results.rows from query function
});

function query(db, querystr, cb){

    db.transaction(function(tx){

        tx.executeSql(querystr, [], function(tx, results){

            cb(results.rows);
            //console.log("ROWS ---> "+results.rows);

            resultSet = results.rows;

        }, dbError);

    }, dbError, dbSuccess);
}

答案 1 :(得分:0)

对于初学者来说,Barmar的评论是正确的:你永远不能保证数据能够在同一个Javascript线程/堆栈/任何你称之为的内容中返回,所以你不能只返回它。

对异步检索项执行某些操作的最常见模式是请求函数应传入一个onSuccess函数,并将结果数据作为参数进行调用。这种模式对性能要好得多,因为UI线程没有被阻止。

var pizza = getMeAPizza('pepperoni');
console.log('Yesss, got my pizza.');

//becomes...

getMeAPizza('pepperoni', function(pizza) {
  console.log('Yesss, got my pizza.');
}

我认为如果你正在开发一个JQuery插件,正如你所说的那样,根据我的理解,一个常见的模式是在返回它时实现“Deferred”对象定义,因此调用函数可以链接一个行动。这部分是我的二手知识,所以我不会费心去拼命解释它......