使用Nodejs执行图像操作异步,无法理解承诺或回调以确定何时完成所有操作

时间:2017-04-21 22:15:58

标签: javascript node.js asynchronous promise

我为提出已经多次发布的问题而道歉,但我无法理解如何使示例/解决方案/教程适应我的代码。我受限于修改其他人的代码,无法从头开始。

我正在使用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完成所有操作的确切时间吗?谢谢。

1 个答案:

答案 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()方法之前完成。