【问题标题】:How to map an array, create promises, and break when one resolves如何映射数组、创建 Promise 并在解决时中断
【发布时间】:2020-01-12 16:54:28
【问题描述】:

我一直在使用 bluebird 库的 Promise.map 函数,该函数从它接收到的数组中返回一个已解决的承诺数组 - 应该如此。

我只想映射数组,直到它达到第一个解析,然后它并退出。

到目前为止我所拥有的是:

var Promise = require('bluebird');

let comparer = async function (img1, imgURLarray) {

        const img = img1

        new Promise.map(imgURLarray, function (imgurl) {

            let img2 = new Promise(x => x(Jimp.read('https:' + imgurl)))

            let diff = Jimp.diff(await img, await img2);

            return diff.percent


        }).then(function (res) {
            console.log(res);
        }); 

comparer(img1, imgURLarray)

参数 img1 是一个 Object 常量,而 imgURLarray 包含超过 200 个 Strings,它们以 1:1 的比例进行比较 - 通过库 Jimp。

而不是返回包含 200 多个 Jimp.diff 对象的整个数组。我只想返回满足此条件的第一个:

(diff.percent < 0.01 ? return imgurl : --END MAP FUNCTION-- )

我研究了 Promise.some(),但由于我不是从一系列承诺开始的,所以我认为这不会奏效。有人知道怎么做吗?将不胜感激。

【问题讨论】:

  • 您是要一次启动所有 200 个 diff,还是一个接一个地尝试,直到找到满足您条件的一个?
  • Jimp.read 究竟返回了什么?你能链接它的文档吗?将其包装在(其他?)承诺中似乎毫无用处。

标签: javascript node.js loops promise bluebird


【解决方案1】:

这可能比您预期的要简单得多:

async function comparer(img, imgURLarray) {
    for (const imgurl of imgURLarray);
        const otherimg = await Jimp.read('https:' + imgurl);
        const diff = Jimp.diff(img, otherimg);
        if (diff.percent < 0.01)
            return imgurl;
    }
    throw new Error("no imgurl with diff.percent < 0.01 found"); // or whatever you want to do
}

【讨论】:

  • 找到答案!非常感谢,这速度有多快太可怕了!!!我肯定把它复杂化了
猜你喜欢
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2019-11-20
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 2017-01-19
相关资源
最近更新 更多