2016-07-11 6 views
3

私は特定の約束事を含むファイルを持っているとしましょう。順番に実行すると、入力ファイルinput.txtが準備されます。特定の約束が解決された後にのみインポート/エクスポートする

// 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";

私はnode prepareInput.jsを実行した場合、ラインstep1().then(step2).then(step3)が実行され、ファイルを作成します。

他のファイルがfileNameをこのモジュールから取得しようとすると、step1().then(step2).then(step3);が実行され、fileNameが公開される前に完了するようにするにはどうすればよいですか?線に沿って何か:ここ

// 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の初心者。私のアプローチが完全に意味がない場合は事前にお詫び申し上げます。:)

+2

なぜ '「(必要ではない./ prepareInput ')。fileName.then(function(inputFileName){...}) '? –

+1

あなたのコードが非同期効果で "感染"したら、それを取り除くことはできません。コードを使用するすべてが非同期になります。 –

+0

'first()'とは何ですか? – Redu

答えて

3

エクスポートが同期であるため、非同期で取得した結果を直接エクスポートすることはできないため、非同期結果が取得される前に発生します。ここでの通常の解決策は、約束を返すメソッドをエクスポートすることです。呼び出し側は、そのメソッドを呼び出し、その約束を使用して、望ましい非同期結果を得ることができます。

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

呼び出し側がこのん:

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

保つために一つのことを念頭に置いているが、物事の順序ですべての操作が非同期の場合、全体の動作が非同期になることであるとなし呼び出し元は結果を同期して取得できます。このように、非同期性を「伝染性」と呼ぶ人もいます。したがって、操作の一部が非同期である場合は、結果として非同期インターフェースを作成する必要があります。それだけで今までのアプリごとに一度に実行されるように、あなたはまた、約束をキャッシュすることができ


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

呼び出し側は、このん:

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

私の場合は、残念ながら「一連の事柄における操作が非同期である」場合に該当します。私は非同期インタフェースを調べたり、私のアプローチを変えなければならないでしょう。それにもかかわらず、あなたの詳細な説明に感謝します! – S200

関連する問題