为对象数组解析蓝鸟承诺

时间:2017-11-30 00:52:35

标签: javascript node.js promise bluebird

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

    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对象中解析promise。我需要做些什么来解决这个承诺?

如果我这样做

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 ... > ]

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

1 个答案:

答案 0 :(得分:1)

你的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。< / p>