我为提出已经多次发布的问题而道歉,但我无法理解如何使示例/解决方案/教程适应我的代码。我受限于修改其他人的代码,无法从头开始。
我正在使用nodejs v6.10,尽管阅读了很多文章和wiki,但我很难实现异步代码处理。
我正在努力确定所有操作何时完成,我相信承诺对我来说是正确的方式。我无法弄清楚如何让它正常工作,但我不再收到任何警告或错误。
我认为我最大的问题是我的图像处理功能没有返回任何东西,我试图强迫它们没有成功。
这是我的基本代码:
var finished;
main();
function main() {
do stuff...
fs.readFile(JSON,...) {
finished = theApp(JSON);
});
Promise.all(finished).then(function(x, y) {
var total = x * y;
console.log("completed: " + total + " at " + Date.now());
}).catch(function() {
console.log("failed.");
});
}
function theApp(JSON) {
do stuff...
for $loop (1..100) {
do JSON stuff...
resizeImages(JSONparameters, image);
}
for $loop2 (1..100) {
do JSON stuff...
finished = function() {
return manipulateImages(JSONparameters, image);
}
}
}
function resizeImages(JSONparameters, image) {
do stuff...
for $i (1..100) {
sharp(image)
.resize(x, y)
.toFile(output)
}
}
function manipulateImages(JSONparameters, image) {
return new Promise(function(resolve, reject) {
do stuff...
for $i (1..100) {
sharp(image)
.blur()
.toFile(output)
}
});
}
我意识到这是很多循环,但这是我现在约束的架构。我也意识到我只是将这个承诺放在了manipulateImage步骤。这是因为resulate操作在manipulateImages操作开始之前完成。
在此配置中,多次调用manipulateImages函数,但不输出任何内容。如果我删除代码周围的“返回新Promise”包装器,它工作正常。但后来我不知道如何返回任何可以传递给main的东西,等到promises.all()返回已解决。
有人可以告诉我如何允许我在console.log完成所有操作的确切时间吗?谢谢。
答案 0 :(得分:1)
我认为你对Promise的基本理解并不完全存在,并且你的解决方案很复杂,这使得你更难理解Promise的核心以及它们的工作方式。想想这样:
// List of images
let images = [
'image1.jpg',
'image2.jpg',
'image3.jpg',
]
// Array to store promises
let promises = []
// Loop through your images
for (const image of images) {
// Create a new promise, adding it to the array
promises.push(new Promise((resolve, reject) => {
// Do your resizing, manipulation, etc
sharp(image)
.resize()
.blur()
.toFile(output, function(err, data) { // Assuming this toFile is an async operation and uses a callback
// After all the resizing, manipulation and file saving async functions are complete, resolve the Promise
resolve()
})
})
}
// Wait until all promises in the promises array are resolved
Promise.all(promises)
.then((){
console.log('image resizing and manipulation is complete')
})
理解Promise的最好方法是,在你的Promise中,你做所有异步的东西。处理回调等等。在Promise中异步执行任何操作。完成后,resolve
。这就是Promise完成的信号。
Promise.all
正在等待promises数组中的所有Promise在运行它的.then()
方法之前完成。