waitForKeyElement.js Но с максимальным временем ожидания - PullRequest
0 голосов
/ 05 марта 2019

При использовании waitForKeyElement.js Мне было интересно, есть ли хорошее решение для реализации максимального времени ожидания?Иногда у меня есть элементы, которые должны быть там, но иногда при плохом отклике Ajax они не появляются, или они могут занять некоторое время, чтобы появиться.В таких случаях я просто хочу, чтобы он продолжал и выполнял отдельную функцию.

Редактировать: например, при попытке «купить» предмет он обычно всегда отвечает «успехом», то есть тем, чего ожидает программа, однако иногда это окно не происходит, если на сервере естьerror или если элемент больше не доступен для «покупки», в этом случае вместо него может быть вставлен другой элемент error, однако это другой элемент, и поэтому он продолжает ждать, а не продолжать обработку следующего элемента.

1 Ответ

0 голосов
/ 05 марта 2019

У вопроса нет ни примера использования, ни MCVE.Есть большая вероятность, что это XY Проблема .

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

Эффект можно получить с помощью кода:

const maxTime       = 5;  //  seconds
var watchdogTimer   = setTimeout (fallBackFunc, maxTime * 1000);
waitForKeyElements ("#foo", desiredFunc, true);

function desiredFunc (jNode) {
    console.log ("Foo found!");
    clearTimeout (watchdogTimer);
}
function fallBackFunc () {
    console.log ("Oh, poo. No foo.");
}



Выгрузка waitForKeyElementsтаймер в таком сценарии не должен быть необходим, но вы также можете сделать это, добавив следующий код в конце fallBackFunc():

function fallBackFunc () {
    console.log ("Oh, poo. No foo.");

    /*-- Optional body double to take fire from waitForKeyElements that the 
        has `true` parameter set.  This is almost never needed.
    */
    var nonce = "IdeallySomeGloballyUniqueStringThatIs_a_ValidCssClass";
    //-- Added node should have properties that match the WFKE selector
    $("body").append (`<span id="foo" class="${nonce}" style="display:none;">blah</span>`);
    setTimeout (function () {$(`.${nonce}`).remove(); }, 333); // time must be > 300
}


Относительно вопроса отредактируйте:

... (страница) отвечает «успехом», то есть тем, чего ожидает программа, однако иногда это поле не происходит ... в этом случаевместо этого может быть вставлен другой элемент ошибки ...

Обычная практика для этого - установить waitForKeyElements для прослушивания и узла успеха и узла ошибки.(См. селекторы jQuery doc .)

В таком случае waitForKeyElementscallback предпримет соответствующее действие для типа переданного ему узла.
Не требуется сторожевой таймер (если страница не может остатьсяактивен и все же не возвращает ни один тип узла - что почти никогда не имеет место).

Например:

waitForKeyElements ("#goodNode, #errorNode", completeTransaction, true);

function completeTransaction (jNode) {
    if (jNode.is ("#goodNode") ) {  //  Match one of the WFKE selectores
        console.log ("Transaction success!");
    }
    else {
        console.log ("Transaction error.");
    }
}

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

...