2011-12-31 34 views
2

我對JavaScript比較陌生,反覆發現自己在一個幫助對象中編寫方法,該對象以回調爲參數,例如這是不好的回調做法?

var utilities = { 
    getTweets: function (user, maxTweets, callBack) { 
      var obj = $(this); 
      $.getJSON('http://api.twitter.com/1/statuses/user_timeline.json?callback=?&screen_name=' + user + "&count=" + maxTweets, function (data) { 
       callBack(data); 
      }); 
    }; 

我然後調用它像這樣:

utilities.getTweets("TESTUSER", 4, function (tweets) { 
       ..... 
      }); 

鑑於我打電話上面使用的setInterval是這樣容易泄漏隨着時間的推移/有沒有更好的方式來寫這個代碼?

回答

10

你現在所做的大部分都很好,除了沒有必要創建額外的閉包。通過這樣寫一個封閉:

function (data) { 
     callBack(data); 
} 

是一樣的直接在參數列表中傳遞callBack

但是如果你能保證用jQuery 1.5或更高版本上運行,那麼更好的方法是隻具有getTweets()返回JQXHR對象,然後你可以使用「推遲」的客戶端代碼的方法:

var utilities = { 
    getTweets: function (user, maxTweets) { 
     var uri = 'http://api.twitter.com/1/statuses/user_timeline.json?callback=?'; 
     var data = { 
      screen_name: user, 
      count: maxTweets 
     }; 
     return $.getJSON(uri, data); 
    }); 
}; 

,然後在客戶端代碼:

utilities.getTweets(user, maxTweets).done(/* your callback here */); 

這樣就可以完全解耦從實現回調。事實上,您可以註冊多個回調和錯誤處理程序,全部不涉及utilities的實現。

注意:使用上面的data的地圖也可以保護您的代碼免受參數注入的影響。

+0

+1這是一個不錯的和乾淨的方法。 – 2011-12-31 13:35:01

+0

+1不錯的一個 - 發佈後我發現額外的關閉;延期使用也是一個很好的接觸。 – Sidebp 2011-12-31 13:40:00

+0

@Sidebp是的,我遲到了,注意到了額外的封閉 - 編輯後。 – Alnitak 2011-12-31 13:41:36

-2

你可以使用這樣的事情:

var utilities = { 
    options: { 
     user: 'value', 
     maxTweets: '4' 
    } 
    getTweets: function() { 
     // access a value 
     this.options.user; 
    } 
} 

或者這將是最好創建具有​​選項等對本文的閱讀,它應該是正是你需要一個適當的插件:

http://jquery-howto.blogspot.com/2009/01/how-to-set-default-settings-in-your.html

+0

爲什麼要插件到處?此外,這裏的問題更多地涉及回調處理和實現。 – darma 2011-12-31 13:34:41

+0

恕我直言,這是糟糕的設計 - 選項應該用於持久狀態(例如基本URL?) - 不適用於每個函數調用都會改變的參數。 – Alnitak 2011-12-31 13:34:57

+0

對不起,我一定沒有讀得夠透徹! – 2012-01-06 14:17:29

1

如果你害怕每次創建函數的內存開銷,那麼這樣做:

utilities.getTweets("TESTUSER", 4, utilities.handleTweets); 

而且在utilities.handleTweets你做你的回調做。

相關問題