首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

探索 XUL 内的多线程编程-3 测试更新

探索 XUL 内的多线程编程-3 测试更新

回到 ,一旦从传递来的消息中抽取出了关键字,就会调用 searchGoogle 函数。此函数使用 Google 的搜索 API 来请求针对这个关键字的搜索结果。要调用此 Web 服务,请注意使用标准的 JavaScript API    XMLHttpRequest。您可能已经注意到了,在用 open 方法发送这个请求时,指定了三个参数。其中最后一个参数指定了此请求是否是异步的。因它默认为 true,所以此请求是异步的。在这种情况下,需要覆盖 XMLHttpRequest 实例的 onreadystatechange 函数以便您可以为这个异步请求设置一个 callback 函数。然而,如果是从一个 Worker 线程做这样的请求,就无需这么做了。而只需将这个异步标志设置为 false,进行同步调用。这样,send 方法将被一直阻塞,直到从 Web 服务返回响应。这让您能很轻松地处理此响应。
在本例中,来自于 Google 的响应是一个 JSON 结构。您可以直接地 eval 这个响应,但使用解析器将会更安全。JavaScript 1.9.1 中也包含了来自于 json.org 的标准 JSON 解析器。因此您只需使用它的解析方法就可以安全地将 JSON 数据解析为一个 JavaScript 对象。剩下的代码则只需从 Google  返回的结构中提取数据并将这些数据放入一个公共结构。该数据随后会被通过 postMessage 函数发送回母线程。当调用 worker 线程上的 postMessage 函数时,就会用从这个 worker 线程发送来的数据调用 Worker 实例(在母线程中)上的 onmessage 方法。这就是为什么要设置  中的这个 onmessage 函数的原因所在。其他的每个 Workers 都做着同样的工作。例如, 显示了作用于 Bing 搜索引擎的那个 worker 线程。
清单 4. Bing 搜索 worker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
onmessage = function(event){
    var keyword = event.data;
    var results = searchBing(keyword);
    postMessage(results);
}

function searchBing(keyword){
    var bingAppId = "YOUR APP ID GOES HERE";
    var url = "http://api.search.live.net/json.aspx?Appid="+
        bingAppId+"&query="+keyword+"&sources=web";
    var xhr = new XMLHttpRequest();
    xhr.open("GET", this.url, false);
    xhr.send();
    var response = JSON.parse(xhr.responseText);
    var results = [];
    var results = {};
    var data = response.SearchResponse.Web.Results;
    for (var i=0;i<data.length;i++){
        result.url = data.Url;
        result.title = data.Title;
        result.description = data.Description;
        results.push(result);      
    }
    return results;
}




如您所见,这段代码与  中的代码十分相似。它使用 onmessage/postMessage 范型来从它的母线程接收和发送数据。当然,这个 Web 服务的 URL 有点不同。返回的结构也有点差异,但您只需将它映射回清单 3 中的公共结构即可。可以想象得到,Yahoo Worker 的代码与 Google 和 Bing 的 Worker 代码将十分相似。只是 URL 有点不一样,并且映射回常规化的数据结构的映射也有点不一样(所有源代码,参见 )。一旦数据进入了常规化的结构,就可以被传递给一个公共函数来更新用户界面。
结束语无论是现在还是将来,并行编程都将是开发一个成功应用程序的关键所在。能利用多线程来从其环境收获最多的应用程序可以提供一种超级的用户体验。在本文中,您用一个非常简单的示例,查询了三个最受欢迎的搜索引擎。不过,可以想象得到同时从每个引擎检索结果为用户体验所带来的改进,而不是每次只从一个搜索引擎检索结果。即使是在一个单 CPU 的计算机上,多线程也会带来很大的不同,因为您不必花费大量时间等待 Web 服务的响应。加入到 JavaScript 1.9.1 中的 Worker API 使得为任何基于 XUL 应用程序进行这类编程变得十分容易。您可以将本文所展示的这种技术应用到 Firefox 扩展中或是使用 XULRunner 的桌面应用程序中。这些 API 很容易使用,并且您可以派生多个线程而又不必担心系统会被锁死。Workers API 为开发人员使用多线程来提高 XUL 应用程序的性能打消了所有顾虑。
返回列表