【发布时间】:2019-02-15 23:59:35
【问题描述】:
没有任何处理的代码:
for (i=0; i<dbImgCount; i++){
(function(i) {
imgDownload(FolderPath[i].FolderPath, function (next){
var url = FolderPath[i].FolderPath;
const img2 = cv.imread(imgDownload.Filename);
match({url,
img1,
img2,
detector: new cv.ORBDetector(),
matchFunc: cv.matchBruteForceHamming,
});
})
})(i);
}
在上面的代码中,imgDownload 是一个用于下载图像的async function,match 会将下载图像的特征与另一个图像匹配。在for-loop之后需要执行一个函数。
如何重构这段代码,使用Promise或async-await,使得每次调用异步函数都被等待并且只有在完成for-loop之后,流程才能继续?
用async-await编辑代码:
FolderPath.forEach(FolderPath => {
(async function () {
var filename = await imgDownload(FolderPath.FolderPath);
var url = FolderPath.FolderPath;
const img2 = cv.imread(filename);
imgs = await match({url,
img1,
img2,
detector: new cv.ORBDetector(),
matchFunc: cv.matchBruteForceHamming,
});
})();
});
function someFunction(){
console.log("After forEach");
}
someFunctiononly如何在forEach之后执行?
【问题讨论】:
-
imgDownload支持承诺吗?如果没有,start with that -
"这样我就可以在此之后执行回调函数。" - 不,如果你想使用 Promise,你不会在之后调用回调函数这样,您将改为返回匹配的承诺。
-
我使用了 image-downloader npm 包,它支持 Promise。 npmjs.com/package/image-downloader
-
好的。您是否查看了their example 并尝试将其应用于您的案例?
-
使用异步/等待?我该怎么办?
var promise1 = new Promise(function(resolve, reject) {resolve('Success!');});promise1.then(function(value) {console.log(value);// 预期输出:“成功!”});这样使用promise?
标签: node.js promise async-await es6-promise ecmascript-2017