在我的项目中,我从功能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还是陌生的,所以请尝试使其生效。谢谢您的帮助。
答案 0 :(得分:0)
示例将使用此JSONPlacerholder和axios,因为此示例的目的是说明等待/异步而不是请求,请务必首先尝试
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