Javascript 如何使用带有setTimeout()的标签进行中断
这是我的密码:Javascript 如何使用带有setTimeout()的标签进行中断,javascript,settimeout,break,Javascript,Settimeout,Break,这是我的密码: mylabel:{ var myTimeout = setTimeout(function(){ SpinnerDialog.hide(); alert("Timeout"); break mylabel; }, 10000); connectWifi(); } 我有一个函数connectWifi(),如果Wi-Fi网络不可用,它可能会挂起,因此我想在固定时间后停止它。此函数包含其他函数,其功能如下: functi
mylabel:{
var myTimeout = setTimeout(function(){
SpinnerDialog.hide();
alert("Timeout");
break mylabel;
}, 10000);
connectWifi();
}
我有一个函数connectWifi()
,如果Wi-Fi网络不可用,它可能会挂起,因此我想在固定时间后停止它。此函数包含其他函数,其功能如下:
function(){
function(){
function(){
}
}
}
当调用timeout函数时,我收到一个错误,显示“Undefined label”
编辑:我的目标不是停止超时功能,而是停止connectWifi功能
如果您想查看connectWifi()函数,这里是代码(我正在使用以下cordova插件:WifiManager、autowifi和CordovaMqTTPlugin):
函数connectWifi(){
cordova.plugins.WifiManager.isWifiEnabled(函数(err,wifiEnabled){
console.log(“isWifiEnabled结果:+wifiEnabled”);
如果(wifiEnabled==false){
cordova.plugins.WifiManager.setWifiEnabled(true,function(err,succes){console.log(err,succes);});
console.log(“--Wifi-Enabled--”);
}
});
window.plugins.autowifi.setssid(s_SSID,s_PASS);
SpinnerDialog.show(null,“Connexion en cours…”,true);
window.plugins.autowifi.connect(功能(scc){
wifiReady=true;
SpinnerDialog.hide();
控制台日志(“Wifi连接”);
log(“首个函数connectMQTT”);
如果(wifiReady){
//连接MQTT
SpinnerDialog.show(null,“Acces au serveur en cours…”,true);
cordova.plugins.CordovaMqTTPlugin.connect({
url:\u url,//仅用于测试目的的公共代理。请尝试使用自托管代理进行生产。
端口:_端口,
clientId:_clientId,
成功:功能{
警报(“连接reussie!”);
连接=真;
log(JSON.stringify);
document.getElementById(“connect”).style.display=“无”;
document.getElementById(“断开”).style.display=“初始”;
document.getElementById(“活动”).innerHTML++=“-->成功:您已连接到,“+\uURL+”:“+\uPort+”
”
SpinnerDialog.hide();
SpinnerDialog.show(null,“恢复唐尼…”,true);
//一个连接MQTT au主题
cordova.plugins.CordovaMqTTPlugin.subscribe({
题目:(题目),
qos:0,
成功:功能{
SpinnerDialog.hide();
document.getElementById(“活动”).innerHTML+=“-->Success:您已订阅主题“+\u topic+”
”
cordova.plugins.CordovaMqTTPlugin.listen(_主题,函数(有效负载,参数,主题,主题模式){
//如果未使用主题模式,则参数将是空对象。
document.getElementById(“活动”).innerHTML+=“-->用于“+topic+”主题的有效负载:“+JSON.stringify(有效负载)+”
”
})
},
错误:函数(e){
SpinnerDialog.hide();
document.getElementById(“活动”).innerHTML+=“-->错误:订阅此主题时出错,“+e+”
”;
document.getElementById(“订阅”).style.display=“初始”;
document.getElementById(“取消订阅”).style.display=“无”;
//警报(“错误!!有问题。请检查控制台”)
控制台日志(e);
}
});
//---------------------
},
错误:函数(e){
SpinnerDialog.hide();
连接=错误;
//document.getElementById('status').innerHTML=“déconnecté”;
//document.getElementById('statusbar')。className=“w3 bar w3 red”
警报(“连接技术,确保您的无线网络连接和服务提供商puis Veillez reessayer”);
document.getElementById(“活动”).innerHTML++=“-->错误:出现了问题,\n”+JSON.stringify(e)+“
”;
document.getElementById(“connect”).style.display=“initial”;
document.getElementById(“断开”).style.display=“无”;
警报(“错误!!有问题。请检查控制台”)
控制台日志(e);
},
onConnectionLost:功能(e){
SpinnerDialog.hide();
log(JSON.stringify(e));
连接=错误;
//document.getElementById('status').innerHTML=“déconnecté”;
//document.getElementById('statusbar')。className=“w3 bar w3 red”
警报(“您已断开连接”);
document.getElementById(“活动”).innerHTML+=“-->您断开了连接”;
document.getElementById(“connect”).style.display=“initial”;
document.getElementById(“断开”).style.display=“无”;
}
});
//--------------------
}否则{
console.log(“wifiReady false”);
}
});
}
(因为我是法国人,所以很少用法语)中断发生在一个匿名函数中,该函数在标记语句中声明,但它本身不是语句的一部分。这就是为什么不能从匿名函数跳转到标签 讨论实际问题的一些问题(如何从计时器取消活动):
您将看到,此时没有简单的内置方式。与其拥有大量代码块,不如将其划分为可重用的小块:
function promisify(fn) {
return function() {
return new Promise((resolve, reject) => {
fn((err, res) => err ? reject(err) : resolve(res));
});
}
}
const isWifiEnabled = promisify(cb => cordova.plugins.WifiManager.isWifiEnabled(cb));
const enableWifi = promisify(cb => cordova.plugins.WifiManager.setWifiEnabled(true, cb));
const connect = options => promisify(cb => cordova.plugins.CordovaMqTTPlugin.connect({
...options,
success: res => cb(null, res),
error: cb,
})();
既然我们已经得到了承诺,我们就可以轻松地将其链接起来并与之合作:
async function ensureWifi() {
if(!await isWifiEnabled()) await enableWifi();
}
要实现超时,我们只需使用Promise.race:
function cancelAfter(promise, time) {
const timeout = new Promise((_, reject) => setTimeout(reject, time, new Error("Timeout")));
return Promise.race(promise, timeout);
}
因此,我们可以:
(async function() {
try {
// show loaders here
await cancelAfter(ensureWifi(), 1000);
await cancelAfter(connect({ /*...*/ }), 200);
// All done
} catch(error) {
// Api error or timeout
}
})()
你的目标不明确。
中断
的目的是什么?您从循环中中断,而不是从函数中中断。@Alban您想停止超时函数吗?可能与我编辑的文章重复以添加更多信息。我不知道它是否回答了您的问题@FINDarkside它说我们可以使用中断来退出标记的块我建议使用回调或承诺,因为该方法不需要阻塞。我不确定是否理解所有问题,但您的答案很有趣。你能解释一下这段代码吗<代码>异步函数ensureWifi(){if(!WAIT isW)
(async function() {
try {
// show loaders here
await cancelAfter(ensureWifi(), 1000);
await cancelAfter(connect({ /*...*/ }), 200);
// All done
} catch(error) {
// Api error or timeout
}
})()