2016-07-11 5 views
3

Nehmen wir an, ich habe eine Datei mit bestimmten Versprechungen, die, wenn sie in der Reihenfolge ausgeführt wird, bereitet eine Eingabedatei input.txt.Import/Export nur, nachdem bestimmte Versprechen gelöst wurden

// prepareInput.js 
 

 
var step1 = function() { 
 
    var promise = new Promise(function(resolve, reject) { 
 
     ... 
 
    }); 
 
    return promise; 
 
}; 
 
       
 
var step2 = function() { 
 
    var promise = new Promise(function(resolve, reject) { 
 
     ... 
 
    }); 
 
    return promise; 
 
}; 
 
       
 
var step3 = function() { 
 
    var promise = new Promise(function(resolve, reject) { 
 
     ... 
 
    }); 
 
    return promise; 
 
}; 
 

 
step1().then(step2).then(step3); 
 

 
exports.fileName = "input.txt";

Wenn ich node prepareInput.js laufen, wird die Linie step1().then(step2).then(step3) ausgeführt und erstellt die Datei.

Wie kann ich das ändern, wenn andere Dateien versuchen, fileName von diesem Modul abzurufen, wird step1().then(step2).then(step3); ausgeführt und abgeschlossen, bevor Dateiname ausgesetzt wird? Etwas entlang der Linie:

// prepareInput.js 
 
... 
 

 
exports.fileName = 
 
    step1().then(step2).then(step3).then(function() { 
 
     return "input.txt"; 
 
    }); 
 

 

 
// main.js 
 
var prepareInput = require("./prepareInput"); 
 
var inputFileName = require(prepareInput.fileName); 
 
      

Node.js Anfänger hier; Entschuldige dich vorher, wenn mein Ansatz völlig sinnlos ist ... :)

+2

Warum nicht 'require (‘ ./ prepareInput '). fileName.then (function (inputFileName) {...}) '? –

+1

Ich meine, sobald Ihr Code mit dem asynchronen Effekt "infiziert" wurde, können Sie ihn nicht loswerden, alles, was den Code verwendet, wird asynchron. –

+0

Was ist 'first()' ..? – Redu

Antwort

3

Sie können die Ergebnisse von etwas, das asynchron abgerufen wird, nicht direkt exportieren, da der Export synchron ist, also bevor alle asynchronen Ergebnisse abgerufen wurden. Die übliche Lösung besteht darin, eine Methode zu exportieren, die ein Versprechen zurückgibt. Der Aufrufer kann dann diese Methode aufrufen und dieses Versprechen verwenden, um das gewünschte asynchrone Ergebnis zu erhalten.

module.exports = function() { 
    return step1().then(step2).then(step3).then(function() { 
     // based on results of above three operations, 
     // return the filename here 
     return ...; 
    }); 
} 

Der Anrufer dann tut dies:

require('yourmodule')().then(function(filename) { 
    // use filename here 
}); 

Eine Sache zu halten, ist Geist, dass, wenn eine Operation in einer Folge von Dingen asynchron ist, dann wird der gesamte Vorgang wird asynchron und keine Der Aufrufer kann dann das Ergebnis synchron abrufen. Manche Leute bezeichnen asynchrone als "ansteckend" auf diese Weise. Wenn also ein Teil Ihrer Operation asynchron ist, müssen Sie eine asynchrone Schnittstelle für das spätere Ergebnis erstellen.


Sie können auch das Versprechen zwischenzuspeichern, so wird es immer nur einmal durchlaufen pro App:

module.exports = step1().then(step2).then(step3).then(function() { 
    // based on results of above three operations, 
    // return the filename here 
    return ...; 
}); 

Der Anrufer dann tut dies:

require('yourmodule').then(function(filename) { 
    // use filename here 
}); 
+0

Mein Fall fällt leider unter "wenn irgendeine Operation in einer Abfolge von Dingen asynchron ist". Ich muss in die asynchrone Schnittstelle schauen oder meine Annäherung ändern. Trotzdem, vielen Dank für Ihre ausführliche Erklärung! – S200

Verwandte Themen