使用await new Promise()时,for循环后的代码未执行

时间:2019-02-01 19:51:13

标签: javascript for-loop async-await

我有一个异步函数,并有一个循环:

let z;
let step = 100;
for(z=0; z < (combinedData.length-1)/step; z += 1){
    // FURTHER CODE
}

在循环中,我有以下代码:

let z;
let step = 100;
for(z=0; z < (combinedData.length-1)/step; z += 1){
    await new Promise((rs,rj)=>{
        setTimeout(()=>{
            for(let x = 0; x < step; x++){
                let a = combinedData; // Array of 2522 elements
                let i = z*step + x;
                if(!(i < a.length))
                    return;
                // LONG CODE TO EXECUTE NOT PASTING BECAUSE IRRELEVANT I THINK
            }
            rs();
        });
    });
    console.log(`Showed ${z}`);
}
console.log('end');

当我运行它时,结果是:

Showed 1
Showed 2
...
Showed 24

一切都正确,除了不显示“ end”。 我检查和没有错误的

//LONG CODE TO EXECUTE NOT PASTING BECAUSE IRRELEVANT

节所以没有有关该担心。

我认为,该错误位于

if(!(i<a.length))return;

但我不知道在哪里,以及为什么。这句话很重要,不要弄 TypeError因为访问了a[i]

2 个答案:

答案 0 :(得分:1)

循环后的代码无法执行,因为您不解析或拒绝创建的Promise

您是正确的,这个if(!(i<a.length))return;会导致问题,因为使用返回语句您取消了setTimeout内部函数的进一步执行,但是您没有解决您的问题诺言。因此,等待功能将永远等待。

要简单地解决您的问题,您可以执行以下操作:

if(!(i<a.length)){
    return rs(); // Returns and resolves your created promise
}

答案 1 :(得分:0)

这可以让您了解如何正确编码循环:

#include <boost/range/iterator_range.hpp>

class MyClass {
public:
    boost::iterator_range< double* > range() const{ 
    boost::iterator_range< double* > itr_range = boost::make_iterator_range< double* >(&container[0], &container[m_size]);
    return itr_range;
 }
private:
    double container[4] {0.0, 1.0, 2.0, 3.0}; 
    size_t m_size = 4;
};

int main() {
   MyClass obj;   

   return 0;
}