使用waitForKeyElement.js时,我想知道是否有一个很好的解决方案来实现最长等待时间?有时我应该具有这些元素,但是有时在Ajax响应较差的情况下它们不会出现,或者可能需要一段时间才能出现。在这种情况下,我只是希望它继续运行并执行单独的功能。
编辑:例如,当尝试“购买”商品时,它通常总是以“成功”框响应,这是程序正在等待的内容,但是有时,如果服务器出错或该项目不再可用于“购买”,在这种情况下,可以插入另一个错误元素,但这是一个不同的元素,因此它将继续等待,而不是继续处理下一个项目。
答案 0 :(得分:2)
该问题没有示例用例,也没有MCVE。很有可能是XY Problem。
也就是说,没有一种优雅的方法来设置最大等待时间(因为以前从来没有需求,也没有需求)。
您可以使用以下代码获得效果:
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 selectors 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)如果在每种情况下都没有将最大计时器设置得足够长,则不会受到破坏。