Я использую window.parent.postMessage для связи с клиентом. Клиент на данный момент может обрабатывать только 1 запись за раз. Я должен отправить им 1 запись, дождаться ответа, отправить им вторую запись. Второй порядок никогда не отправляется, потому что мой флаг всегда является нулевым событием, хотя он устанавливается в прослушиватель событий.Проблема с Window.parent.postMesasge Ack
Это мой отправить Метод сообщения:
var SendMessage = function (Record, count, readyForNextRecord) {
if (Record.length > 0) {
var response = sessionStorage.getItem("response");;
if (readyForNextRecord === true) {
var url = (window.location != window.parent.location) ? document.referrer : document.location;
window.parent.postMessage(Record[count], url);
count++;
}
if(count < Record.length){
if (response == null) {
interval = window.setInterval(SendMessage(Record, count, false), 100)
} else {
response = null;
clearInterval(interval);
window.setTimeout(SendMessage(Record, count, true), 100);
}
}
}
События слушателя
window.addEventListener("message", ReceiveMessage, false);
var ReceiveMessage = function (event) {
for (var val in event.data) {
var message = event.data[val];
switch (message.toString().toLowerCase()) {
case "success":
sessionStorage.setItem("response", true);
break;
case "failure":
sessionStorage.setItem("response", false);
break;
default:
break;
}
}
}
В конце концов, я достиг максимального размера стека вызовов. Uncaught RangeError: Максимальный размер стека вызовов
'window.setInterval (SendMessage (запись, граф, правда), 100), 'эта часть правильная? Или вы хотели снова использовать setTimeout? Поскольку вы никогда не очищаете этот интервал, вы создаете бесконечный цикл, независимо от того, является ли ответ нулевым или нет. – Shilly
Я хочу использовать setInterval, если есть больше записей. Я обновил сценарий, чтобы отменить inverval и проверить дополнительные записи. –
Тогда вы должны использовать setTimeout, так как вы используете рекурсивную функцию. Вы подражаете setInterval, когда SendMessage снова вызывает себя, поэтому, используя интервал здесь и отменяя предыдущий интервал каждый раз, когда вызывается SendMessage, это то же самое, что и при использовании setTimeout. – Shilly