Javascript函数等待其他一个发生

时间:2015-10-23 15:55:52

标签: javascript

你好我是javascript的新手,我不知道如何让函数等待其他人完成,这是我的代码:

        // other code
        db.transaction(function (transact,callback) {
            transact.executeSql('SELECT * FROM buildings WHERE id = ?', [id], function (transact, results) {
                if (results.rows.length > 0) {
                    buildingsCache.push(JSON.parse(results.rows.item(0).data));
                    index = buildingsCache.length - 1;
                }
                else {
                    alert("Building not found in database!");
                }
            });

        });
        return buildingsCache[index];
        // other code

问题是当前函数在子函数中设置之前返回值。我需要做这样的事情:

        // other code
        var FINISHED=false;
        db.transaction(function (transact,callback) {
            transact.executeSql('SELECT * FROM buildings WHERE id = ?', [id], function (transact, results) {
                if (results.rows.length > 0) {
                    buildingsCache.push(JSON.parse(results.rows.item(0).data));
                    index = buildingsCache.length - 1;
                }
                else {
                    alert("Building not found in database!");
                }
            });
            FINISHED=true;
        });
        while(!FINISHED);
        return buildingsCache[index];
        // other code

但它不起作用。我在这里检查了一些其他的解决方案,但没有做任何工作。你能帮忙吗?

3 个答案:

答案 0 :(得分:0)

为此目的使用promises。

查看Q js库:http://github.com/kriskowal/q

答案 1 :(得分:0)

您需要更改代码,以便事务回调是调用等待它的函数的回调。基本上,您获取buildingsCache的函数不会返回值。相反,它将收到一个回调,并在其可用时将其传递给buildingsCache。这与db.transaction函数使用的模式相同

function fetchBuildingsCache(onDone){
    db.transaction(function (transact,callback) {
        transact.executeSql('SELECT FROM...', [id], function (transact, results) {
            //process db results...
            //then "return" by calling our callback
            onDone(buildingsCache[index]);
        });
    });
}

//and this is how you use it:
fetchBuildingsCache(function(cache){
    console.log(cache);
}

当然,这种模式的一个副作用是每个调用fetchBuildingsCache的函数和调用那些函数等的所有函数也必须转换为回调传递样式。

可悲的是,这在Javascript中是不可避免的。您可以做的最好的事情是使用更高级别的库(如promises或async.js)或使用其中一个向Javascript添加async / await语法的Javascript转换器。

答案 2 :(得分:0)

你在db.transaction(函数(transact,callback)中有一个回调函数,在executeSql完成后正确使用它来执行下一组代码。

promise表示异步操作的最终结果。它是一个占位符,结果将在其中实现。

正确使用它回调与承诺。