2017-08-30 4 views
0

Ich versuche, ein Objekt Objekte in JS zu erstellen, aber ich denke, ich habe einige Probleme mit der asynchronen Ausführung.Erstellen Sie ein Objekt Objekte

Hier ist mein Code:

// Extract data (episode number, characters firstname's) from .docx to JSON 
 

 
var mammoth = require("mammoth") 
 

 
function docx2Object (filepath) { 
 
    
 
    return mammoth.extractRawText({path: filepath}) 
 
    .then(function (res) { 
 
     return res.value; 
 
    }) 
 
    .then(function (res) { 
 
     let arr = {} 
 
     arr["number"] = "" + res.match(/(?!Episode #)\d+/) 
 
     arr["names"] = [...new Set(res.match(/^[^:\r\n]+(?=:)/gm))] 
 
     return arr 
 
    }) 
 
} 
 

 
function files2JSON (arrayScripts) { 
 
    
 
    let arr = {} 
 
    let i = 0 
 
    arrayScripts.forEach(function(element) { 
 
     docx2Object(element).then(function (res) { 
 
      arr[i++] = res 
 
      console.log(JSON.stringify(arr, null, '\t')) 
 
     }) 
 
    }) 
 
    return JSON.stringify(arr, null, '\t') 
 
} 
 

 
let arrayScripts = ["doc1.docx", "doc2.docx"] 
 
console.log(files2JSON(arrayScripts))

Und hier ist die Ausgabe:

{} 

{ 
    "0": { 
     "number": "10600", 
     "names": [ 
      "Hilary", 
      "Jean-Claude", 
      "Devon", 
      "Jean Claude", 
      "Cane", 
      "Lily", 
      "Jack", 
      "Phyllis", 
      "Victor", 
      "Nikki", 
      "Neil", 
      "Paul", 
      "Dr. Barrett", 
      "Christine", 
      "Kelly" 
     ] 
    } 
} 
{ 
    "0": { 
     "number": "10600", 
     "names": [ 
      "Hilary", 
      "Jean-Claude", 
      "Devon", 
      "Jean Claude", 
      "Cane", 
      "Lily", 
      "Jack", 
      "Phyllis", 
      "Victor", 
      "Nikki", 
      "Neil", 
      "Paul", 
      "Dr. Barrett", 
      "Christine", 
      "Kelly" 
     ] 
    }, 
    "1": { 
     "number": "10601", 
     "names": [ 
      "Hilary", 
      "Devon", 
      "Jean+Claude", 
      "Jean + Claude", 
      "Jean/Claude", 
      "Jean/Claude", 
      "Cane", 
      "Lily", 
      "Jack", 
      "Phyllis", 
      "Victor", 
      "Nikki", 
      "Neil", 
      "Paul", 
      "Dr. Barrett", 
      "Christine", 
      "Kelly" 
     ] 
    } 
} 

Mein Array ist leer und meine Indizes tun match.Can nicht jemand helfen?

+0

Haben Sie versucht, es zu debuggen, stellen Sie eine Reihe von Konsolenprotokollen in Ihre Funktionen ein. Und sehen Sie, welche ausgeführt werden, welche nicht und was mit Ihren Objekten passiert. Und sag mir, wenn ich falsch liege, aber du kannst nicht mehr als eine Rückkehr haben, da zuerst alles abbrechen wird – noitse

Antwort

1

denke ich, Ihr Problem mit

arrayScripts.forEach(function(element) { 
    docx2Object(element).then(function (res) { 
     arr[i++] = res 
     console.log(JSON.stringify(arr, null, '\t')) 
    }) 
}) 

ist der docx2Object Aufruf asynchron Bedeutung Iteration des forEach zurückkehren und sofort auszuführen. Dies bedeutet, dass files2JSON möglicherweise ausgeführt wird, bevor die gesamte Verarbeitung erfolgt ist.

Am wahrscheinlichsten, was Sie tun möchten, ist jedes Versprechen in einem Array zu speichern und dann Promise.all() zu verwenden, um alle auf einmal zu lösen und das Versprechen von Promise.all() zurückzugeben und darauf zu warten. Insgesamt ist die Struktur dieses wäre so etwas wie

function asyncTask1(task) { 
    return getPromise(task); 
} 

function asyncTask2() { 
    var tasks = ["eat", "sleep"]; 
    var promises = tasks.map(function(task) { 
    return asyncTask1(task); 
    }); 
    return Promise.all(promises); 
} 

asyncTask2().then(function(response) { 
    console.log("I ate and slept."); 
}); 

Nummer eins zu sehen, die ich persönlich tun, wenn Asynchron-Debugging-Code ist nur eine ganze Reihe von console.log s werfen und sehen, was, wenn sie ausgeführt wird. Es hilft wirklich, die Reihenfolge der Ausführung zu sehen.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

+0

Vielen Dank, es funktioniert! – amerej

0

Dies hilft Ihren output.As erhalten Sie globale falsche Schrittzahl und auch mammoth.extractRawText() -Methode enthält falschen Code verwenden.

// Extract data (episode number, characters firstname's) from .docx to JSON 
var mammoth = require("mammoth"); 

function docx2Object (filepath) { 

    return mammoth.extractRawText({path: filepath}) 
     .then(function (res) { 
     return res.value; 
     }).then(function (res) { 
     var arr = {}; 
     arr["number"] = "" + res.match(/(?!Episode #)\d+/); 
     //arr["names"] = [...new Set(res.match(/^[^:\r\n]+(?=:)/gm))]; 
     return arr 
     }); 

} 

function files2JSON (arrayScripts) { 
    var arr = {}; 

    arrayScripts.forEach(function(element,index) { 
    docx2Object(element).then(function (res) { 
     arr[index++] = res; 
     console.log(res,index) 
     console.log(JSON.stringify(arr, null, '\t')); 
    }) 
    }); 
    return JSON.stringify(arr, null, '\t'); 
} 

var arrayScripts = ["doc1.docx", "doc2.docx"]; 
console.log(files2JSON(arrayScripts)); 
Verwandte Themen