你好我是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
但它不起作用。我在这里检查了一些其他的解决方案,但没有做任何工作。你能帮忙吗?
答案 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表示异步操作的最终结果。它是一个占位符,结果将在其中实现。
正确使用它回调与承诺。