我使用的是一个JavaScript应用程序接口,其中大多数函数都是异步的。API是WebKit JavaScript Database API,它是到操作SQLite3数据库的功能子集的绑定。我理解使事物异步的设计决策,而不是阻塞,并提供响应式的用户界面。在我的情况下,我知道我对异步API调用的使用会执行得很快。既然是这样,我想为我的开发人员提供一种更干净、更容易使用的强制同步调用的包装器API。
下面是异步调用
db.executeSql(sqlStatement, function(result) {
// do something with result
});
这就是我想要做的
var result = dbWrapper.executeSql(sqlStatement);
// do something with result
有没有一种设计模式/方法可以做到这一点?编写或链接到代码示例是首选。目标平台/浏览器是iPhone上的Mobile Safari。
谢谢
发布于 2008-10-18 12:31:05
很抱歉,JavaScript不提供语言原语(例如线程或协程),以使异步事物同步动作,反之亦然。
通常情况下,只有一个执行线程,所以在导致创建请求的调用堆栈完全解开之前,您不能从计时器或XMLHttpRequest thread状态更改中获得回调。
因此,简而言之,您并不能真正做到这一点;在您所链接的WebKit页面上使用嵌套闭包的方法是我所知道的在这种情况下使代码可读的唯一方法。
*:除了在一些模糊的情况下,这些情况对你没有帮助,通常被认为是bug
发布于 2011-01-13 23:06:53
StratifiedJS正是允许您这样做的。
甚至有一篇文章介绍了如何将其应用于浏览器存储:http://onilabs.com/blog/stratifying-asynchronous-storage
这是它使用https://gist.github.com/613526的分层JavaScript库
示例如下:
var db = require("webdatabase").openDatabase("CandyDB", ...);
try {
var kids = db.executeSql("SELECT * FROM kids").rows;
db.executeSql("INSERT INTO kids (name) VALUES (:name);", [kids[0]]);
alert("done");
} catch(e) {
alert("something went wrong");
}
也许有点晚了,但当时这项技术还不存在;)
发布于 2008-10-18 11:30:32
如果使用的是jQuery Ajax:$.ajax()
您可以将asynch的属性设置为false,然后您将向服务器发出一个同步ajax请求。
https://stackoverflow.com/questions/214491
复制相似问题