2017-11-30 5 views
0

Ich möchte die Bildpfade lesen, sie in Binärdaten konvertieren, einen Index anhängen und dann etwas anderes tun, nachdem alle Dateien konvertiert wurden. Ich habe den folgenden Code:Auflösen von Bluebird Versprechen für Array von Objekt

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 
    }); 

die

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

Es gibt scheint, wie das Versprechen, nicht innerhalb des buffer Objekt nicht gelöst wird. Was muss ich tun, um das Versprechen zu lösen?

Wenn ich

tun
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 
}); 

es zurück:

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

das ist, was ich will, aber ich war nicht in der Lage, den Index anzuhängen.

Antwort

1

Sie sind Promise.all wird eine Reihe von Objekten gegeben, die Versprechen enthalten, nicht die Versprechen selbst. Sie müssen nur das Array sicherstellen, dass eine Reihe von tatsächlichen Versprechen ist:

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 
}); 

EDIT: Es fällt mir ein, dass meine ursprüngliche Post würde den falschen Wert für den Index gegeben haben. Um das zu beheben, müssen Sie den aktuellen Index als Teil des Versprechens hinzufügen (z. B. nicht über den Abschluss), da sonst alle gleich imagePaths.length wären.

+0

Hallo, danke für die Korrektur. Deine Lösung macht Sinn und funktioniert. Ich möchte auch bemerken, dass Sie a) in der pufferData.push-Zeile verpasst haben. – user3559233

+1

nicht sicher, warum Sie den Index so hätten ... 'data [n]' wäre das Ergebnis von 'imagePath [n]' versprechen - so scheint der Index redundant –

+0

Ich wollte die Bilder indizieren, weil meine gedacht ist, dass die Dateien asynchron gelesen werden (so dass das 2. Bild vor dem 1. Bild gelesen werden kann) und ich möchte sie so ordnen, wie sie vom Bildpfad kommen. – user3559233

Verwandte Themen