JS:如何阻止一个函数在执行另一个函数时循环?

时间:2019-11-30 10:58:53

标签: javascript function

在我的项目中,我从功能F1中的流式视频中提取特征点,如果其中一些与数据库中的数据匹配,则需要在F1中启动其他功能F2。但是,F2直到结束都无法执行,因为F1会将输入数据不断更新为F2,因此它没有足够的时间。我可以在F2处理数据时停止F1运行吗?

在我的代码中,我使用tracking.js和OpenCV.js包。首先,我运行视频流,然后针对每个帧: (“ corners2”和“ descriptors2”是数据库中的数据)

function f1 (){

   context2d.drawImage(video, 0, 0, canvas2d.width, canvas2d.height);
   src1.data.set(context2d.getImageData(0, 0, canvas2d.width, canvas2d.height).data);

   var blur1 = tracking.Image.blur(src1.data, canvas2d.width, canvas2d.height, blurRadius);
   var gray1 = tracking.Image.grayscale(blur1, canvas2d.width, canvas2d.height);
   var corners1 = tracking.Fast.findCorners(gray1, canvas2d.width, canvas2d.height);
   var descriptors1 = tracking.Brief.getDescriptors(gray1, canvas2d.width, corners1);

   cv.imshow("outputCanvas2d", src1);

   const FPS = 30;
   let begin = Date.now()
   let delay = 1000/FPS - (Date.now() - begin);
   setTimeout(f1, delay); 

   f2(corners1,descriptors1);

   function f2(corners1,descriptors1) {

       var matches = tracking.Brief.reciprocalMatch(corners1, descriptors1, corners2, descriptors2);

       matches.sort(function(a, b) {
           return b.confidence - a.confidence;
       });

       if (matches.length > 50){
           window.app = new App(); 
       } else {
           console.log("not enought keypoints")
           var matches = []
       }
   }
}
setTimeout(f1, 0);

在F2中,如果我有足够的匹配项,我想通过调用window.app = new App();来启动AR会话,但它会给出一个错误Cannot create an XRWebGLLayer with a lost WebGL context.,我认为这是由于F1尝试启动AR会话时保持同时运行。

很抱歉,如果我的解释有点混乱,我对JS还是陌生的,所以请尝试使其生效。谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

示例将使用此JSONPlacerholderaxios,因为此示例的目的是说明等待/异步而不是请求,请务必首先尝试

const f1 = async (params) => {
    axios.get('https://jsonplaceholder.typicode.com/todos/').then(
    ).then((res) => {
        console.log('f1')
    });
};

const f2 = async (params) => {
    axios.get('https://jsonplaceholder.typicode.com/todos/').then(
    ).then((res) => {
        console.log('f2')
    });
};

for (let i = 0; i < 20; i++){
    f1();
    f2();
    // results will appear interferring as f1 will run & we won't wait till it finishes, instead
    // the code will continue to f2 then won't wait for it to finish & then loop again 
}

如果要等待其中之一完成,请使用await f1()阻止所有代码,直到f1()完成,如果返回smth,请确保将其保存在变量中

只需两个正常函数,在参数前加上async一词,即可了解更多info