Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 循环中的异步方法如何按顺序执行?_Javascript_Node.js - Fatal编程技术网

Javascript 循环中的异步方法如何按顺序执行?

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()=

我想多次从数据库中获取数据。如何设置循环以200ms为间隔执行getData()函数。如果其中一个成功了,其余的就不会被触发。这是一种异步方法,与这里的问题不同:

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范例了解async
getDB
的风格会很有帮助。它是否回报了承诺?接受回调?@MarkMeyer它可以是一个普通函数。我把它打包在这里是为了回报承诺,因为在这之后我需要一些方法。这里介绍了很多选项:。
getDB
是异步的吗?如果(db)
,您将使用
测试什么?如果
getDB()。如果需要回调…如果他们都能成功获取数据呢。我能得到这样的信息吗“一旦其中一个收到数据,其他人就会停止”。如果第一个已经得到了答案,您的代码将执行三次,对吗?
.catch()
仅在承诺失败时执行。所以当其中一个成功时,它就会停止。我正在使用你的解决方案。但我发现,如果我在第二次尝试中成功地获取了数据并解析了它,那么它就无法在类似这样的代码中传递给下一个函数。callGetDb()。然后(数据)=>{}“数据”将在此处为空,用于发布特定代码。你能看一下吗?