javascript中的异步控制流
async control flow in javascript
我正在为chrome编写一个浏览器扩展,它使用Web SQL进行本地存储。这两个组件的代码似乎都严重依赖异步操作。我对异步操作有很好的理解,但在编写严重依赖它们的代码方面没有太多经验。
例如:
var CSUID = "";
//this is an async callback for handling browser tab updates
function checkForValidUrl(tabId, changeInfo, tab) {
getCookies("http://www.cleansnipe.com/", "CSUID", handleCookie);
if(CSUID != ""){ //this could be in handleCookie if i could access the tab
//do stuff with the tab
}
}
function handleCookie(cookie) {
if (cookie != "" && cookie != null) {
CSUID = cookie;
}
}
为了克服缺乏将变量传递到这些处理程序/从这些处理程序返回变量的能力,我发现自己创建了全局变量并在处理程序中设置它们。当然,这并不能像预期的那样工作,因为变量通常在回调执行之前就被访问了。
处理这种情况的最佳做法是什么?我曾想过使用全局标志/计数器和while循环来暂停执行,但这似乎很混乱,容易导致应用程序挂起。
如果jQuery是一个选项,那么它有一个漂亮的系统,称之为延迟对象。它允许对异步情况进行优雅而有效的管理,或者实际上是同步的,视情况而定。
(缺陷不仅限于jQuery,而且jQuery有一个很好的API)。
这里有一个简单的例子来演示这个概念。
//get data func
function get_data(immediate) {
//if immediate, return something synchonously
if (immediate)
return 'some static data';
//else get the data from something over AJAX
else
return $.get('some_url');
}
//two requests two get data - one asynchronous, one synchronous
var data1 = get_data(true), data2 = get_data();
//do something when both resolved
$.when(data1, data2).done(function(data1, data2) {
//callback code here...
});
deferred不必涉及AJAX;您可以创建自己的延迟对象(jQuery的AJAX请求会自动生成并返回它们),并手动解析/拒绝它们。几个月前,我写了一篇关于这个的博客文章——这可能会有所帮助。
相关文章:
- Node.js使用Series函数(模式?)实现流控制时出现意外结果
- 比较两个值时出现JavaScript输出和控制流错误
- 类似Facebook的盒子-控制流中出现的内容
- 量角器 iOS 自动化:茉莉花规范超时.重置 Web 驱动程序控制流
- 任何控制Javascript异步加载顺序的方法
- 控制流没有在jquery中的对话框中等待
- 使用NodeJS和Sequelize控制流
- javascript中的异步控制流
- 如何将包含猫鼬函数的方法与控制流框架(例如异步或 Step)一起使用
- Node.js 中意外的 vm.runInThisContext 控制流
- 了解 Node.js 应用程序中的控制流
- 经典 ASP 流控制的替代方法
- KnockoutJS - 无容器控制流绑定初始值
- JavaScript's的控制流结构:浏览器特定的或JS固有的
- 承诺控制流 - 捕获与拒绝
- 异步库是否有任何用于处理管道的控制流
- 节点异步控制流
- Node.js异步控制流,3个进程处理共享数据
- 异步.串联控制流量误差使用胖箭头或自参考
- Javascript通过JSON控制数据流