Javascript 循环中的异步方法如何按顺序执行?
我想多次从数据库中获取数据。如何设置循环以200ms为间隔执行getData()函数。如果其中一个成功了,其余的就不会被触发。这是一种异步方法,与这里的问题不同:Javascript 循环中的异步方法如何按顺序执行?,javascript,node.js,Javascript,Node.js,我想多次从数据库中获取数据。如何设置循环以200ms为间隔执行getData()函数。如果其中一个成功了,其余的就不会被触发。这是一种异步方法,与这里的问题不同: for(变量i=0;i{ //使用数据库 }).catch(()=>{ if(i++newpromise(r=>setTimeout(r,timeout)); const waitManyTimes=async()=>{ for(设i=0;inewpromise(r=>setTimeout(r,ms)); 让main=async()=
for(变量i=0;i<3;i++){
setTimeout(getData,200);}
这将导致输出时间间隔非常接近,而不是200毫秒,因为它们是异步的。三个“设置超时”在短时间内触发。与0.001s 0.002s 0.003s一样,输出时间为0.201、0.202、2.203
getData()返回一个承诺。但只要它工作,它就可以是正常的函数。不要使用循环。让函数调用
setTimeout()
在失败时再次运行
var i=0;
函数callGetDB(){
getDB()。然后(db=>{
//使用数据库
}).catch(()=>{
if(i++<3){
setTimeout(callGetDB,200);
}
});
}
在执行下一个setTimeout
我认为回调不可能做到这一点,就像setTimeout
一样,因此您应该将其转换为基于承诺的调用
constpromisettimeout=timeout=>newpromise(r=>setTimeout(r,timeout));
const waitManyTimes=async()=>{
for(设i=0;i<3;i++){
等待承诺超时(200);
//在这里做一些事情,比如getDB
控制台日志(i);
}
}
waitManyTimes()代码>使用async/await
:
let sleep = ms => new Promise(r => setTimeout(r, ms));
let main = async() => {
for(var i = 0; i < 3; i++) {
let db = getDB();
if (db)
return db;
await sleep(200);
}
};
let sleep=ms=>newpromise(r=>setTimeout(r,ms));
让main=async()=>{
对于(变量i=0;i<3;i++){
设db=getDB();
中频(db)
返回分贝;
等待睡眠(200);
}
};
我建议远离回调,转向新的promise范例了解asyncgetDB
的风格会很有帮助。它是否回报了承诺?接受回调?@MarkMeyer它可以是一个普通函数。我把它打包在这里是为了回报承诺,因为在这之后我需要一些方法。这里介绍了很多选项:。getDB
是异步的吗?如果(db)
,您将使用测试什么?如果getDB()。如果需要回调…如果他们都能成功获取数据呢。我能得到这样的信息吗“一旦其中一个收到数据,其他人就会停止”。如果第一个已经得到了答案,您的代码将执行三次,对吗?.catch()
仅在承诺失败时执行。所以当其中一个成功时,它就会停止。我正在使用你的解决方案。但我发现,如果我在第二次尝试中成功地获取了数据并解析了它,那么它就无法在类似这样的代码中传递给下一个函数。callGetDb()。然后(数据)=>{}“数据”将在此处为空,用于发布特定代码。你能看一下吗?