2011-12-31 2 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.

NB: использование карты для data выше также защищает ваш код от инъекции параметров.

+0

+1 Это хороший и чистый подход. –

+0

+1 Хороший - после публикации я заметил дополнительное закрытие; использование отсрочек также является приятным прикосновением. – Sidebp

+0

@ Sidebp да, я тоже опаздывал, заметив дополнительное закрытие - отредактировал это после. – Alnitak

-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

+0

ИМХО, это плохой дизайн. Параметры должны быть для постоянного состояния (например, базового URL?) - не для параметров, которые изменяются при каждом вызове функции. – Alnitak

+0

Извините, я, должно быть, не прочитал его достаточно тщательно! –

1

Если вы боитесь накладных расходов памяти создания этой функции каждый раз, а затем сделать что-то вроде:

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

И в utilities.handleTweets вы делаете, как вы делаете в функции обратного вызова.

Смежные вопросы