JavaScript异步查询:我应该在每个方法或对象中放置回调吗?

时间:2011-12-01 10:20:22

标签: javascript callback

我正在开发一个JavaScript框架 - Cubes Slicer OLAP server的前端。我现在要实现聚合浏览器对象,它将对服务器执行查询。建议的API示例:

  • browser.aggregate(cell,{drilldown:some_dimension}) - 获取单元格的聚合并向下钻取维度
  • browser.facts(cell) - 获取单元格内的所有事实
  • ...

我正在考虑处理结果的三个选项:

每次浏览器调用中

A:

browser.aggregate(cell, options, handler)
任何查询的浏览器中的

B:

browser.result_handler = my_result_handler
browser.aggregate(cell, options)

结果处理程序的位置如下:

result_handler = function(browser, result, context) { ... }

C:委托对象:

browser.delegate = my_controller

my_controller的方法与浏览器查询方法相对应。

还是有其他选项 D

我是JavaScript的新手(事实上,这是我用该语言编写的第一件事)。在JS框架中进行这种异步处理的最常用方法是什么?我更倾向于浏览器中的常用处理程序,选项 B

我正在创建的框架在这​​里:https://github.com/Stiivi/cubes.js(使用underscore.js和jQuery)

如果有人感兴趣,我有一个有效的例子,我不是把它放在这里,因为它不是很精致,只是沙盒/游乐场的东西。

我会非常感谢任何建设性的提示。

[编辑] 请注意,浏览器对象不是一次查询的一次性对象,它会在Web应用程序的报表的每个部分经常重复使用。顾名思义,它用于浏览数据。想要图表吗?使用浏览器进行聚合。想要一张桌子吗?使用浏览器。想要深入了解/获取更多细节?使用相同的浏览器。 “Cell”对象保存当前的浏览上下文,如果与单维文件系统相比,它就像多维“当前目录”。

[EDIR 2] 使用示例:您有一个带有条形图的页面,按年份汇总,以及带有按类别汇总的表格的饼图。饼图+表包含相同的数据。您需要两个请求两个上下文:barpie

browser.aggregate(cell, { context: "bar" }, handler)
browser.aggregate(cell, { context: "pie" }, handler)

或当处理程序在浏览器中时:

browser.aggregate(cell, { context: "bar" })
browser.aggregate(cell, { context: "pie" })
浏览器中的

处理程序会删除一些代码噪音。

2 个答案:

答案 0 :(得分:1)

  

请注意,浏览器对象不是一次查询的一次性对象

我认为你已经回答了自己的问题。

aggregate发出网络请求(确实如此,对吗?),你不知道可以花多长时间。如果您有一个请求回调,并且在上一个请求完成之前又发出了另一个请求,则永远不会调用前一个回调函数。

如果您问的是什么是常见模式,我会说肯定会通过回调。

例如,在客户端,jQuery用于网络。在服务器端(Node.js),有HTTP请求/服务器,它们传递回调,然后是Socket.IO或Websocket,都传递回调。然后有数据库,Mongo,Redis,它们都通过了回调。

答案 1 :(得分:0)

嗯,第一次使用javascript并且已经编写了一个框架?祝你好运; - )

我建议调查JQuery,它会执行大量的异步事件处理,也可能会使您的代码受益。

更新:

通常,您只需传递一个回调函数,该函数在您的操作完成后调用。