javascript - JS : Recursively calling a promise function

标签 javascript node.js

我正在制作一个可以创建图像缩略图的node.js 应用程序。为了避免在生成缩略图时卡住应用程序,我决定使用异步 library用于创建缩略图。然而,根据图像的不同,可能需要多个缩略图尺寸。

var thumbnailSizes = [100];
if (image.type == 'coolImage') thumbnailSizes.push(500);
generateThumbnails(image.filename, thumbnailSizes).then(function() {
    // Do cool things with the saved thumbnails (This is never reached)
});

function generateThumbnails(filename, thumbnailSizes) {
    return new Promise(resolve => {
        var path = filename.substring(0, filename.lastIndexOf('\\'));
        console.log('start');
        console.log('length = ' + thumbnailSizes.length);
        thumb({
            prefix: thumbnailSizes[0] + '_';
            source: filename,
            destination: path,
            width: thumbnailSizes[0]
        }).then(function () {
            if (thumbnailSizes.length > 1) {
                console.log('next');
                generateThumbnails(filename, thumbnailSizes.splice(0, 1));
            } else {
                console.log('finished');
                resolve('true');
            }
        }).catch(function (e) {
            console.log('error');
        });
        console.log('end');
    });
}

此代码成功创建了第一个缩略图,但未能创建第二个缩略图。这是代码停止运行后我的控制台的样子。

> Console Output
start
length = 2
end
next
start
length = 1
end

代码第二次成功调用generateThumbnails(),但没有再次调用thumb函数,跳到最后并且永远不会解析。我怎样才能做到这一点?

最佳答案

我认为这里不需要递归。

async function generateThumbnails(filename, thumbnailSizes) {
  var path = filename.substring(0, filename.lastIndexOf('\\'));

  return await Promise.all(thumbnailSizes.map(size => thumb({
    prefix: `${size}_`,
    source: filename,
    destination: path,
    width: size
  })));
}

或者,如果您需要一张一张地创建缩略图:

async function* generateThumbnails(filename, thumbnailSizes) {
  var path = filename.substring(0, filename.lastIndexOf('\\'));
  for(const size of thumbnailSizes) {
    yield await thumb({
      prefix: `${size}_`,
      source: filename,
      destination: path,
      width: size
    });
  }
}

这可以通过调用函数中的 for wait 循环使用:

for await(const thumbnail of generateThumbnails(file, sizes) {
  // handle single size
}

此外,我不会使用 .substring() 进行路径操作,我确信 Node path module有一个或七个函数可以帮助您可靠地从路径中提取有趣的部分。

关于javascript - JS : Recursively calling a promise function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53031226/

相关文章:

javascript - 有没有比在 app.js 上绑定(bind)模块名称更好的方法来动态加载 View 模型和 View 以显示模式?

javascript - onChange 函数更改表中显示的数据

javascript - 在卸载/卸载前使用 Javascript 发送帖子请求。那可能吗?

node.js - docker :找不到命令 "/bin/sh"

javascript - Stream.end() 是同步的吗?

javascript - 如何使用JavaScript返回不同 anchor 元素的脚注?

javascript - 如何从 .NET 5 应用程序使用 observablehq/plot?

javascript - 通过函数调用将消息从Node.js服务器发送到客户端

java - 类路径或引导类路径中的 fatal error : Unable to find package java. lang

Node.Js : How to log a request's body without access to the Request object