2013-08-13 4 views
0

В интерфейсе JavaScript у меня есть функция funcA, которая обычно выполняет , как только клиент получает конкретное сообщение A.Условное выполнение функции задержки

Возможно, что сервер отправит другое сообщение Bдо отправка A. Когда это произойдет, клиент получит два сообщения: сначала B, затем A, а другая функция funcB (сгенерирована B) будет выполнена до funcA.

Теперь есть элегантный способ, чтобы задержать выполнение funcA при получении A, если funcB выполняет первый?

Некоторые псевдо-код ниже, чтобы проиллюстрировать идею:

... 

// called upon receiving msg `A` 
// but need to delay its execution if receiving `B` and executing funcB first 
function funcA(param) { 
    ... 
} 

// called upon receiving msg `B` 
function funcB(param) { 
    ... 
} 

... 

// receiving messages from server 

var msg = JSON.parse(...); 

if (msg.type === 'A') { 
    funcA(msg.data); 
} 
else if (msg.type === 'B') { 
    funcB(msg.data); 
} 
else if (msg.type === 'C') { 
    ... 
} 

// deal with other types of message 
... 

я могу думать, используя сочетание «флага» и условной проверки перед тем каждый выполнение funcA, который, кажется, не очень элегантный для меня.

Пожалуйста, обратите внимание: этот вопрос не о том, как задержать выполнение функции (которая обычно достигается путем использования setTimeout), вместо этого, он просит дизайн шаблона/структуры данной конкретной логики кода.

+0

Какой код у вас сейчас? Вы можете это показать? – putvande

+3

Программирование и элегантность - не всегда лучшие друзья. Использование флага в этом случае вполне приемлемо. Я бы сделал это без рассмотрения в этом сценарии. – Archer

+0

путь в случае, если у вас есть сообщение B, чтобы не поставить meassage A как часть вызова B только funcB с обратным вызовом funcA –

ответ

2

Вам нужен способ, чтобы следить, если funcB был вызван, то вы можете проверить, что внутри funcA и пусть он называет себя с задержкой:

var funcBCalled = false; 

function funcB() { 
    funcBCalled = true; 
    // do something... 
} 

function funcA() { 
    if (funcBCalled) { 
    funcBCalled = false; 
    window.setTimeout(funcA, 1000); 
    } else { 
    // do something 
    } 
} 
Смежные вопросы