首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >包装异步JavaScript函数以使其同步的模式

包装异步JavaScript函数以使其同步的模式
EN

Stack Overflow用户
提问于 2008-10-18 03:28:56
回答 5查看 12K关注 0票数 19

我使用的是一个JavaScript应用程序接口,其中大多数函数都是异步的。API是WebKit JavaScript Database API,它是到操作SQLite3数据库的功能子集的绑定。我理解使事物异步的设计决策,而不是阻塞,并提供响应式的用户界面。在我的情况下,我知道我对异步API调用的使用会执行得很快。既然是这样,我想为我的开发人员提供一种更干净、更容易使用的强制同步调用的包装器API。

下面是异步调用

代码语言:javascript
复制
db.executeSql(sqlStatement, function(result) {
  // do something with result
});

这就是我想要做的

代码语言:javascript
复制
var result = dbWrapper.executeSql(sqlStatement);
// do something with result

有没有一种设计模式/方法可以做到这一点?编写或链接到代码示例是首选。目标平台/浏览器是iPhone上的Mobile Safari。

谢谢

EN

回答 5

Stack Overflow用户

发布于 2008-10-18 12:31:05

很抱歉,JavaScript不提供语言原语(例如线程或协程),以使异步事物同步动作,反之亦然。

通常情况下,只有一个执行线程,所以在导致创建请求的调用堆栈完全解开之前,您不能从计时器或XMLHttpRequest thread状态更改中获得回调。

因此,简而言之,您并不能真正做到这一点;在您所链接的WebKit页面上使用嵌套闭包的方法是我所知道的在这种情况下使代码可读的唯一方法。

*:除了在一些模糊的情况下,这些情况对你没有帮助,通常被认为是bug

票数 10
EN

Stack Overflow用户

发布于 2011-01-13 23:06:53

StratifiedJS正是允许您这样做的。

甚至有一篇文章介绍了如何将其应用于浏览器存储:http://onilabs.com/blog/stratifying-asynchronous-storage

这是它使用https://gist.github.com/613526的分层JavaScript库

示例如下:

代码语言: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");
}

也许有点晚了,但当时这项技术还不存在;)

票数 8
EN

Stack Overflow用户

发布于 2008-10-18 11:30:32

如果使用的是jQuery Ajax:$.ajax()

您可以将asynch的属性设置为false,然后您将向服务器发出一个同步ajax请求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/214491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档