2

これは何百万回も聞かれていることは知っていますが、私は本当に非同期の Javascript 関数とコールバックを分解しようとしていて、クリックしないだけです。Max Ogden の Art of Node の例を見ています。これは次のとおりです。

var fs = require('fs')
var myNumber = undefined

function addOne(callback) {
  fs.readFile('number.txt', function doneReading(err, fileContents) {
    myNumber = parseInt(fileContents)
    myNumber++
    callback()
  })
}

function logMyNumber() {
  console.log(myNumber)
}

addOne(logMyNumber)

これを分解すると、 addOne が呼び出されると、最初に開始され、fs.ReadFile完了するまでに時間がかかる場合があることを理解しています。

私が得られないのは、コードが(追加される前に)callback()実行され続けないということです。必要な前に実行を停止しているのは何ですか。これが全体のポイントですか? それとも起こるまで起こらない?「完了」したときに呼び出されると想定することになっていますか?logMyNumbermyNumbercallback()callback()doneReadingdoneReadingfs.readFile

この非常に一般的な質問を手伝ってくれてありがとうございました:)

4

5 に答える 5

2

「fs.readFileが「完了」したときにdoneReadingが呼び出されると想定することになっていますか?」

あなたはそれを仮定する必要はありません、あなたはそれをかなり確信することができます. ロギングを使用して、コードが実行される方法と順序を確認できます。

var fs = require('fs')

console.log("starting script");
console.log("message 1");
function addOne(callback) {
  fs.readFile('number.txt', function doneReading(err, fileContents) {
    console.log("finished loading the file");
    console.log("message 2");
    callback()
  })
}
console.log("message 3");
//logMyNumber will be called after file has read
function logMyNumber() {
  console.log("message 4");
}
console.log("message 5");
addOne(logMyNumber)
console.log("message 6");

// _ _ _ _ _ _ _ _ _非同期動作 を理解する簡単な方法は、おなじみのすべてのタイマーを使用することです

console.log("message 1");
var num = 2;

function something() {
    console.log("message 2");
}
function somethingElse() {
    console.log("message 3");
}
console.log("message 4");

setTimeout(something, 1000);
console.log("message 5");
setTimeout(somethingElse, 500);

//コードは、上から下ではなく 1 - 4 - 5 - 3- 2 のように実行されます。このようにすると、その理由は明らかです。//同じ理由でファイルを読み取ります

于 2013-11-08T20:10:05.077 に答える
0

コードの流れは次のとおりです。

  1. addOne(logMyNumber) を呼び出すと実行されます。
  2. addOne はファイルを読み取り、ファイルが読み取られると、次のようになります
  3. 「doneReading」関数でコードを実行すると、コールバック (logMyNumber) が呼び出されます。
于 2013-11-08T20:06:54.580 に答える
0

fs.readFile は、指定されたコールバックを呼び出します。読み取りが終了した後、コードで doneReading を実行します。これは、Node.js が一般的にコールバックを処理する方法です。非同期操作の終了後に実行されるコールバックを指定します。

于 2013-11-08T20:10:39.470 に答える
0

fs.readFile?の 2 番目の引数を参照してください。と呼ばれる機能doneReadingです。

fs.readFiledoneReadingファイルの読み取りが終了したときにのみ実行されます。gets が実行されるとdoneReading、最後の行は callであり、この場合は関数callback()への参照です。logMyNumber

于 2013-11-08T20:07:49.690 に答える
0
// callback is a parameter to addOne
// callback is a function, but functions are just objects in javascript
// so the addOne function just knows that it has one parameter, not that
// callback is a function
function addOne(callback) {

  // callback is now captured in the closure for the doneReading function
  fs.readFile('number.txt', function doneReading(err, fileContents) {
    myNumber = parseInt(fileContents)
    myNumber++

    // callback is executed here
    // But we are inside the doneReading function
    // which is itself a callback to the fs.readFile function
    // therefore, it does not get executed until the file has finished reading
    callback()
  })
}

// similarly, logMyNumber has not been called, it has just been defined
// as a function (object)...
function logMyNumber() {
  console.log(myNumber)
}

// ...and passing logMyNumber to addOne here does not execute it
addOne(logMyNumber)

それはそれをクリアしますか?

于 2013-11-08T20:10:54.203 に答える