2016-11-01 14 views
-2

私はd3でビジュアライゼーションを作成するプロジェクトを開発中です。 私は、順番にロードされるファイル名を持つ配列を持っています。Javascript - Async

しかし、配列を実行してそれぞれのメソッドを呼び出すと、配列内の2番目の要素は、最初の要素の読み込みが完了する前に呼び出されます。

 for(j=0;j<chosenAirports.length;j++) 
     { 
      var fileName = chosenAirports[j]; 
      var splitData = fileName.split("_");     
      readFile(splitData[0],selectedYear,splitData[0] + "_" + selectedYear); 
     } 

readFileは、各配列要素を呼び出すための関数です。しかし、ある要素のreadFileが完了する前に、ループ内の次の要素が呼び出されています。

これはjavascriptの非同期機能によるものだと思います。 誰も私がこれを避ける方法を提案することができます。

助けていただければ幸いです。

+0

'readFile()'という名前を使ってすべての頭を悩ましているので、あなたの 'readFile()'が実際に何をしているのか分かりますか?関数が入力、出力、内部的に何の詳細も持たないブラックボックスであれば、私たちは何らかの前提や助けをすることはできません。 – gelliott181

答えて

0

ファイルを読んでいるとすれば、これはノード上で実行されていると思いますか?

ので、その後readFile機能は、どちらかであるノードのreadFile機能やを呼び出すとノードのreadFile機能である場合。

あなたが述べたように、これは非同期機能です。表示されている問題を防ぐためのreadFileSyncという同期バージョンがあります。

0

コードを機能させたい場合は、同期readFileSync()メソッドを使用すると問題が解決します(詳細はhttps://code-maven.com/reading-a-file-with-nodejs)。

非同期関数が返されても、非同期に実行されることを確認したい場合は、RxJS約束の作業に興味があるかもしれません。

+0

私はあなたをすべて間違った方向に導くのではないかと心配しています。readFileはファイルからの読み取りを表していません。これは、特定のタスク(ファイルに関係しないもの)を行う関数の名前に過ぎません。完全な情報を提供しないと申し訳ありません。 – Minu

0

非同期のままにしたい場合は、Node/Javascriptのコアと闘う必要はないのでお勧めします - プロミス内のファイルの処理をラップすることができます:ファイル名をパラメータとし、処理結果とともに約束を返す。以下のような

何か:

function processFile(fileName) { 
    return new Promise((resolve,reject) => { 
    fs.readFile(fileName, function(err, data){ 
     if (err) { 
     return reject(err); 
     }; 
     return resolve(processData(data)); 
    }); 
    }); 
} 

明らかに、あなたはあなたのprocessData()機能を提供し、それは与えられたファイルの処理のためにデータを戻すことを確認する必要があります。最終的な結果を得るために、そして、あなたがこの約束の結果を照会

const promise = chosenAirports.reduce((promise, fileName) => { 
    return promise.then((previousResult) => { 
    return processFile(fileName); 
    }) 
}, Promise.resolve()); 

その後、すべてのファイルの処理順序でチェーンに、次のようなアレイ上reduceメソッドを使用することができます。

promise 
.then((result) => { 
    console.log('Result: ', result); 
}) 
.catch((err) => { 
    console.log(err); 
}); 

データを処理し、すべての結果を収集するメカニズムを実装するが、その解決策では困難ではない。

関連する問題