#javascript #jquery #conditional-statements
#javascript #jquery #условные операторы
Вопрос:
Я ищу общий шаблон или метод для выполнения следующего:
Сервер отправляет сообщения клиенту (браузеру). Эти сообщения ПОСТУПАЮТ НЕ все вместе, а в разные моменты времени.
Для каждого входящего сообщения клиент сравнивает его со списком условий. Если сообщение соответствует условию, это условие выполняется.
Как только все условия выполнены, клиент выполняет некоторые заказы и переходит к следующему набору условий.
Это повторяется до тех пор, пока не будут выполнены все доступные наборы условий.
Мой фактический подход к этой проблеме заключается в следующем:
Набор вложенных массивов содержит наборы условий и эквивалентные действия, которые необходимо выполнить при выполнении каждого набора условий. Например:
var condAct =
[
[ // set 0
[ // conditions
"condition 1", "condition 2"
],
[ // actions
action, action2
]
],
...
Переменная сохраняет номер фактического набора условий.
var condStep = 0;
При поступлении сообщения запускается одна функция. Он сравнивает входящее сообщение со всеми условиями на фактическом шаге. Если сообщение соответствует условию, условие удаляется из массива. Как только все условия на этом шаге будут выполнены и, таким образом, удалены из массива, действия выполняются, и мы переходим к следующему шагу:
function condRcv(msg){
for (var i = 0; i < condAct[condStep][0].length; i ) { // for each condition in the actual set
if(msg === condAct[condStep][0][i]){ // if it matches the incoming message
condAct[condStep][0].splice(i, 1); // remove the condition from the array
if(condAct[condStep][0].length === 0){ // and if the actual conditions array is already empty
for(var j = 0; j < condAct[condStep][1].length; j ){ // for each action in the actions array
condAct[condStep][1][j]; // execute it
condStep ; // up a step
return; // get outta here
}
}
}
}
}
Мой подход кажется изначально допустимым, но немного запутанным, как процедура, так и код.
Существует ли обычно используемый шаблон или метод в js или даже jquery для решения подобной ситуации?
Спасибо. Дайте мне знать, если вы думаете, что я могу улучшить вопрос.
Комментарии:
1. ДА… общий шаблон заключается в использовании массива обещаний и передаче этого массива в Promise.all(), и в обратном вызове вы получите ответы в том же порядке, в каком они были отправлены. Если вы используете jQuery как помеченный, можете использовать
$.when()
вместоPromise.all()
2. @charlietfl Спасибо за ответ. Хотя я читал об этом, я не совсем понимаю promises. Хотите написать подробный ответ, чтобы я мог его принять?
3. это запросы ajax, которые вы делаете?
4. @charlietfl нет, я использую «sillyserver» ( github.com/jagenjo/SillyServer.js ) для отправки сообщений между подключенными клиентами. Эти сообщения относятся к началу и концу синтеза или распознавания речи (web speech api). Я создаю какую-то условную оценку, которая включает синтез и распознавание для нескольких клиентов. Например, прежде чем клиенты 2 и 3 начнут синтезировать речь, мне нужно убедиться, что они завершили распознавание речи, и что клиент 1 также завершил синтез речи. Что-то в этом роде.
5. ok…so вы не можете перебирать серию запросов одновременно… вам нужно отправить, а затем дождаться ответа. Так что вместо массива обещаний… вам понадобится цепочка обещаний. Вы отправляете что-то… когда
server.on
возвращается соответствующее сообщение… это разрешило бы первое обещание, связанное с использованиемthen()
для выполнения шага nest. Вы можете связать столькоthen()
, сколько необходимо
Ответ №1:
Вы можете использовать .queue()
, .promise()
, .then()
var q = $({});
var queueName = "conditions";
var arr = [1,2,4,4,5];
var conditions = [2,3,4,5,7];
var results = [];
var fn = function (prop, next) {
console.log(prop);
results.push(prop);
next();
}
q.queue(queueName, $.map(arr, function(curr, index) {
return function(next) {
return curr 1 === conditions[index]
? fn(curr 1 " equals " conditions[index], next)
: /* do other stuff here, pass `next` function, call `next` */
fn("curr plus 1 does not equal " conditions[index], next)
}
}));
var promise = q.dequeue(queueName).promise(queueName);
promise
.then(function() {
console.log("complete", results);
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>