如何映射数组、创建承诺以及在解决时中断

How to map an array, create promises, and break when one resolves

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

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

我目前拥有的是:

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。

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

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

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

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

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
}