2017-10-21 19 views
2

async/がどのように動作するのかわかりません。私はそれを少し理解していますが、私はそれを機能させることはできません。asyncでファイルを読むにはどうすればいいですか?

function loadMonoCounter() { 
    fs.readFileSync("monolitic.txt", "binary", async function(err, data) { 
     return await new Buffer(data); 
    }); 
} 

module.exports.read = function() { 
    console.log(loadMonoCounter()); 
}; 

私はreadFileSyncを使用することができます知っているが、私がしなければ、私は非同期/待って、私はちょうど問題をバリーますを理解することは決してないだろう知っています。

目標:loadMonoCounter()を呼び出し、ファイルの内容を返します。

このファイルは、incrementMonoCounter()が呼び出されるたびに(すべてのページ読み込み時)インクリメントされます。このファイルには、バイナリ形式のバッファのダンプが含まれており、SSDに格納されています。

私は何をしているのですか?がコンソールで定義されていません。

答えて

11

await/asyncを使用するには、約束を返すメソッドが必要です。コアAPI関数はpromisifyのようなラッパーなしでそれをしない:注意点としては

const fs = require('fs'); 
const util = require('util'); 

// Convert fs.readFile into Promise version of same  
const readFile = util.promisify(fs.readFile); 

async function getStuff() { 
    return await readFile('test'); 
} 

// Can't use `await` outside of an async function so you need to chain 
// with then() 
getStuff().then(data => { 
    console.log(data); 
}) 

readFileSyncをコールバックを取ることはありません、それがデータを返すか、例外をスローします。あなたが提供する関数は無視され、実際の戻り値を捕捉していないので、あなたが望む値を得ていません。

+1

ありがとう、私はコアAPIをラップする必要があることを知らなかった。あなたは素晴らしいです。 –

+2

コアAPIは現代のPromise仕様と 'async' /' await'の採用に先行しているので、これは必要なステップです。良いニュースは、「promisify」は通常、それが混乱することなく動作することです。 – tadman