2017-05-20 4 views
0

Ich hämmere meinen Kopf gegen die Wand, um herauszufinden, wie Daten, die asynchron in ein Array geschrieben werden, in eine Datei geschrieben werden. Das synchrone Schreiben der Daten (und Prüfen, ob das Element das letzte auf der Liste ist) benötigt zu viel Zeit, so dass ich beschloss, es asynchron laufen zu lassen. Nach einigen Nachforschungen scheint es, dass ich einen Rückruf verwenden könnteAusführen einer Funktion, nachdem der asynchrone Vorgang abgeschlossen ist

Ich würde es vorziehen, keine externe Bibliothek dafür zu verwenden, da ich ziemlich sicher bin, entweder ein Callback oder ein Versprechen sollte den Trick tun. Vielen Dank!

//Iterate through list and make HTTP request to get data 
dataDocument.map(function(item, index) { 

    request(item, function(err, res, html) { 
     if (err) throw err; 
     renderData(html, item); 
    }); 

}); 

//Renders data 
function renderData(html, item) { 
    ...some calculations here. 

    writeData(output, id, function() { 
     pushed(output); 
    }); 
}; 

//Writes the data on file 
function writeData(output, id) { 
    fs.appendFile('./output.json', output); 

//SHOULD I USE A CALLBACK HERE TO PUSH INTO AN ARRAY ONCE IT'S COMPLETE? 

}; 

//NEED HELP HERE: Pushed the data into an array and eliminates last comma. 
function pushed(data) { 
    var arr = []; 
    arr.push(data); 
} 
+0

nicht ‚Verstehen zu überprüfen, ob der Punkt auf der Liste der letzte ist) nimmt zu viel Zeit, so habe ich beschlossen, es zu machen, laufen asynchron '. Können Sie den Arbeitsablauf dieses Datenprozesses grundsätzlich beschreiben? – wannadream

+0

Sie können sich im Allgemeinen nicht dazu entschließen, etwas Asynchrones zu erstellen. Die zugrunde liegende Operation ist entweder asynchron oder nicht. Das Hinzufügen eines Elements zu einem Array ist sicherlich nicht selbst asynchron. 'fs.appendFile()' ist selbst async. Wirklich nicht sicher, was du erreichen willst. Unklare Frage, wie es jetzt steht. Bitte klären Sie mit weiteren Einzelheiten, was Sie zu tun versuchen. Und verwenden Sie bitte Text in Ihrer Frage, nicht nur Kommentare in Ihrem Code. – jfriend00

+0

Versprechen zurück und verkettet "dann", um eine Kaskade von Versprechen zu bilden, die iterativ aufgerufen werden. – botika

Antwort

0

Mit Versprechungen wird es sauberer und schlanker aussehen. Promisify alle beteiligten Funktionen und verwenden Promise.all zu wissen, wenn Sie alle Daten gesammelt haben:

// Promisify all the involved callback-based functions: 
function promiseRequest(item) { 
    return new Promise(function (resolve, reject) { 
     request(item, function (err, res, html) { 
      if (err) { 
       reject(err); 
      } else { 
       resolve(html); 
      } 
     }) 
    }) 
} 

//Renders data 
function promiseRenderData(html, item) { 
    //...some calculations here. 
    return promiseWriteData(output, id).then(function() { 
     return output; 
    }); 
}; 

//Writes the data on file 
function promiseWriteData(output, id) { 
    return new Promise(function (resolve, reject) { 
     fs.appendFile('./output.json', output, function (err) { 
      if (err) { 
       reject(err); 
      } else { 
       resolve(); 
      } 
     }); 
    }); 
} 

//Iterate through list and make HTTP request to get data 
Promise.all(dataDocument.map(function(item, index) { 
    return promiseRequest(item).then(function(html) { 
     return promiseRenderData(html, item); 
    }; 
})).then(function(arr) { 
    // Do something with `arr` here 
}); 
Verwandte Themen