2014-01-31 28 views
2

下面的代码正在工作,但我对方法的责任感并不满意。我试图保持方法浅薄和“单一职责”,但他们仍然做了太多不同的事情国际海事组织。重构异步CoffeeScript AJAX

在同步世界我将有三个方法:

  • doajax(URL),该返回响应
  • 解析(响应),该返回数据的创建阵列
  • 平局(数据)与阵列图

但我不知道如何在这种异步情况下做到这一点。任何线索如何重组?将有若干图片,我希望能够用新数据更新给定的图形,而无需创建一个新的,所以会出现像updateGraph的方法(graphId,newData)

doajax = (url) -> 
    $.ajax 
    url: url 
    dataType: 'html' 
    success: (response) -> 
     parse response 

parse = (response) -> 
    xmlDoc = $.parseXML(response) 
    xml = $(xmlDoc) 
    arr = [] 
    xml.find('S').each -> 
    timestamp = new Date($(this).attr('T')) 
    value = parseFloat($(this).attr('AI1')) 
    arr.push [timestamp, value] 
    draw arr 

draw = (data) -> 
    new Dygraph($('#graph1')[0], data, 
    // options.. 
) 

doajax 'http://api.example.com/stats.xml' 

回答

2

使用动态回调,而不是调用其他预定义功能:

doajax 'http://api.example.com/stats.xml', (xml) -> draw(parse(xml)) 

或者干脆用deferred/promise object通过$.ajax,你的确可以立即返回返回:

doajax = (url) -> 
    $.ajax 
    url: url 
    dataType: 'xml' # or use 'text' for explicitly calling jQuery.parseXML 

parse = (xmlDoc) -> 
    $(xmlDoc).find('S').map -> 
    timestamp = new Date($(this).attr('T')) 
    value = parseFloat($(this).attr('AI1')) 
    [timestamp, value] 
    .toArray() 

draw = (data) -> 
    new Dygraph($('#graph1')[0], data, 
    # options.. 
) 

doajax 'http://api.example.com/stats.xml' 
    .then parse 
    .then draw 
+0

这就是我正在寻找的。我已阅读延期/承诺,但不能将其应用于我的代码,因为我对JS很新手。谢谢Bergi! – eik3

1

由于您使用jQuery的,还有被称为承诺通过例如jQuery.Deferred其还内置到jQuery.ajax

所以,你可以做一个强大的功能是:

doajax = (url) -> 
    $.ajax 
    url: url 
    dataType: 'xml' 

parse = (response) -> 
    xml = $(response) 
    arr = [] 
    xml.find('S').each -> 
    timestamp = new Date($(this).attr('T')) 
    value = parseFloat($(this).attr('AI1')) 
    arr.push [timestamp, value] 
    draw arr 

draw = (data) -> 
    new Dygraph($('#graph1')[0], data, 
    // options.. 
) 

而且通过级联叫它功能如下:

doajax("/blabla") 
    .then(parse) 
    .then(draw) 

每个函数的返回值将作为参数传入下一个函数。