Функция Javascript, которую можно вызывать только один раз [дубликат]

В то время как обещания и обратные вызовы хорошо работают во многих ситуациях, боль в задней части выражает нечто вроде:

if (!name) {
  name = async1();
}
async2(name);

. В итоге вы пройдете через async1; проверьте, не определено ли name или нет, и соответственно вызовите обратный вызов.

async1(name, callback) {
  if (name)
    callback(name)
  else {
    doSomething(callback)
  }
}

async1(name, async2)

Хотя в в порядке хорошо , это раздражает, когда у вас много подобных случаев и обработка ошибок.

Fibers помогает в решении проблемы.

var Fiber = require('fibers')

function async1(container) {
  var current = Fiber.current
  var result
  doSomething(function(name) {
    result = name
    fiber.run()
  })
  Fiber.yield()
  return result
}

Fiber(function() {
  var name
  if (!name) {
    name = async1()
  }
  async2(name)
  // Make any number of async calls from here
}

Вы можете проверить проект здесь .

2
задан Rob Morris 31 October 2013 в 13:28
поделиться

2 ответа

Используйте команду jQuery one():

$('#team-members .team-thumb').one('click', function(e){ ... }

Описание: Прикрепите обработчик к событию для элементов. Обработчик выполняется не более одного раза для каждого элемента для типа события.

Помимо этой встроенной команды вы всегда можете использовать логический флаг:

var event_handler_enabled = true;
$('#team-members .team-thumb').one('click', function(e){
  if ( event_handler_enabled ){
    // code for handling click goes here
    event_handler_enabled = false; // ensure this code will not be executed again
  }   
}

I Рекомендуем первый вариант. Нет причин повторно изобретать колесо. Если jQuery имеет встроенный метод для выполнения обработчика только один раз - используйте его! :)

4
ответ дан Lix 4 September 2018 в 07:39
поделиться

Вы можете сделать это внутри события click:

var $viewport = $('.bx-viewport');
if($viewport.find('#slide-me').length === 0)
     $viewport.prepend('<div id="slide-me"></div>');
  • Сначала забрать элемент bx-viewport.
  • Incase, slide-me не вставлен в начало элемента bx-viewport, затем добавьте элемент, иначе ничего не сделайте.
2
ответ дан palaѕн 4 September 2018 в 07:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: