在JavaScript中使循环异步

在JavaScript中使循环异步,javascript,for-loop,ecmascript-6,Javascript,For Loop,Ecmascript 6,我有一个由for a循环组成的函数。循环运行一段时间,然后返回一个值。我唯一的目标是在循环完全运行后返回值。我尝试了承诺和异步等待,但它们都不适合我 异步函数 异步函数getTotalQuestion(标记,问题){ var输出=[]; for(设i=0;i{ 输出推送(数据); }) .catch((错误)=>{ 控制台日志(err); }) } 返回输出; } 异步函数的调用 getTotalQuestion('eco', 9).then((data) => { qu

我有一个由for a循环组成的函数。循环运行一段时间,然后返回一个值。我唯一的目标是在循环完全运行后返回值。我尝试了承诺异步等待,但它们都不适合我

异步函数

异步函数getTotalQuestion(标记,问题){ var输出=[]; for(设i=0;i{ 输出推送(数据); }) .catch((错误)=>{ 控制台日志(err); }) } 返回输出; } 异步函数的调用

getTotalQuestion('eco', 9).then((data) => {
        question = data; //here data is coming as undefined
    })
    .catch((err) => {
        console.log(err)
    })

上面代码中的问题是它没有等待
getOne
数据
推入
输出
数组。为了获得正确的
输出
,您必须在
for
循环中等待
getOne
的结果

异步函数getTotalQuestion(标记,问题){ var输出=[]; for(设i=0;i如果每个
getOne()
调用彼此独立,并且可以按任何顺序调用,那么您可以使用
Promise.all()
异步调用多个
getOne()
调用。然后等待它们全部完成,然后从
getTotalQuestion()
返回总结果

异步函数getTotalQuestion(标记,问题){ 试一试{ return wait Promise.all(数组(问题).fill(0).map(=>getOne(标记)); }捕捉(错误){ 控制台日志(err); } }
如果对
getOne()
的调用顺序很重要,那么显然其他发布的都可以工作,您应该在for循环中等待每个调用。阅读更多关于。并进一步了解
Promise.all()
与此中的多个
wait
调用之间的区别。

必须使for循环中的函数等待。类似于等待getOne(标签)…这听起来像是一个X/Y问题。我喜欢这样想,想象一下
getOne
需要很长时间,比如30秒才能给出结果。在原始代码中,当
i==0
时,它将启动30秒的进程,但不会等待它完成,而是继续执行
i==1
,等等。谢谢,@kunal。它起作用了。只是一个疑问,getOne已经是一个promise,promise本身就是一个异步方法。它必须等待,不是吗it@Pranaykumar承诺是一种可能在未来解决或拒绝的价值观(强调未来)。因此,每当函数返回一个承诺时,它可能会返回一个值(resolve)或抛出一个错误(reject),但在它完成处理之后。现在,为了使用函数的返回值,必须显式地等待(使用
wait
then
)it完成任务并提供所需的输出。