解决对象数组的蓝鸟承诺



我想读取图像路径,将它们转换为二进制数据,附加索引,然后在所有文件转换后做其他事情。我有以下代码:

    var bufferData = [];
    for (var i = 0; i < imagePaths.length; i++) {
        bufferData.push({
            data: fs.readFileAsync(imagePaths[i]),
            index: i
            }
        );
    }

    Promise.all(bufferData).then(function (data) {
        console.log(data);
        //do something
    });

返回

[ { data: 
 Promise {
   _bitField: 134217728,
   _fulfillmentHandler0: undefined,
   _rejectionHandler0: undefined,
   _promise0: undefined,
   _receiver0: undefined },
index: 0 } ]

似乎没有在BufferData对象内解决承诺。我需要做什么来解决诺言?

如果我做

var bufferData = [];
for (var i = 0; i < imagePaths.length; i++) {
    bufferData.push(fs.readFileAsync(imagePaths[i]));
}

Promise.all(bufferData).then(function (data) {
    console.log(data);
    //do something
});

它返回:

[ <Buffer ff d8 ff e1 18 b9 45 78 69 66 00 00 49 49 2a 00 08 00 00 00 09 00 0f 01 02 00 06 00 00 00 7a 00 00 00 10 01 02 00 0e 00 00 00 80 00 00 00 12 01 03 00 ... > ]

这是我想要的,但是我无法附加索引。

您的 Promise.all是一个包含承诺的对象,而不是承诺本身。您只需要确保数组是一系列实际承诺:

for (var i = 0; i < imagePaths.length; i++) {
    var fileIndexPromise = Promise.all([
        fs.readFileAsync(imagePaths[i]),
        i
    ])
    bufferData.push(fileIndexPromise.then(([result, index]) => ({
        data: result,
        index: index
    })));
}

Promise.all(bufferData).then(function (data) {
    console.log(data);
    //do something
});

编辑:在我看来,我的原始帖子会给出索引的不正确值。为了解决这个问题,您必须将当前索引作为承诺的一部分(例如,不要通过封闭访问),否则它们都等于imagePaths.length

最新更新