2017-10-11 12 views
1

私は、次のコードを理解しようとしている:私の理解が正しければ定義時に匿名関数が呼び出されますか?

const Storage = artifacts.require("./Storage.sol"); 

contract('Storage', function(accounts) { 
    let storage; 
    before(async() => { 
    storage = await Storage.deployed(); 
    }); 
    it("Set user data", async() => { 
    await storage.setUserData(1, 1234); 
    const data = await storage.getUserData.call(1); 
    assert.equal(data, 1234, 'Return user data'); 
    }); 
}); 

は教えてください。 "before"は、無名関数として知られるパラメータとして名前のない関数を受け入れる関数です。

匿名関数はasync()としてマークされています。つまり、サーバーからの戻り呼び出しをブロックするまでブロックされます。 ストレージ変数が初期化されるまで、anonymous関数は戻りません。 before関数は、別の関数内で定義されているため、直ちに呼び出されます。 "before"という単語が別の関数の中に書かれていない限り、別の関数の外で定義されていれば呼び出されません。
また、匿名関数は別の関数の内部で定義されているため、すぐに呼び出されます。

ありがとうございます!

+2

'before'は関数を受け付ける関数ですが、匿名かどうかは関係ありません。また、' async'関数はブロックしないので、約束事を通してスケジューリングできます。 – MinusFour

+0

"*" before "という単語が書かれていない限り*" - これは 'before'が特別なキーワードだと思ったように聞こえます。そうではなく、 'before'という名前のjs関数です。そのコールバックは、実装に完全に依存します。 'function before(cb){/ * do nothing * /}'や 'function before(cb){setTimout(cb、50);/* later * /} '、または'関数の前に(cb){cb(); cb();/* 2回* /} '。 – Bergi

答えて

1

いいえ、匿名関数は定義上呼び出されません。あなたが見ているのは、関数beforeに最初のパラメータとして渡された単なる関数式です。

beforeファンクションは、後でテスト実行の一部としてこの関数を呼び出します。
beforeに渡された関数が完了した後で、「ユーザーデータの設定」テストが実行されます。
これは、テストフレームワークが各テストの前にbefore関数を呼び出すためです。

beforeは、テストフレームワークによって自作された機能であり、特別な言語機能はありません。

2

ワンタイムメモ:非同期機能ブロックではありません。それらは約束に基づいているため、非同期関数の実行は待機中に停止しますが、スレッドをブロックしていません。それは彼らがとても有用である理由の一つです。

いいえ、関数、匿名またはそれ以外の場合は、定義に対して自動的に呼び出されません。例えば

:あなたが実際にtest()を呼び出さない限り

function test() { 
    () => console.log('hello') 
} 

これは、ログに記録されません。それがコールバックかどうかは関係ありません。

function before(cb){ 
} 

し、それを匿名コールバック関数を渡します:

before(() => console.log("hello")) 

コンソールが定義何に起こることを示すログに記録されることはありませんので、それがコールバックを発生しませんたとえば、私たちは関数がbefore()呼ば書くことができます。

は通常、しかしbefore()は、そのコールバックを取ると、それを呼び出します。それは実際に前に関数の内部で呼ばれるまで

function before(cb){ 
    cb() 
} 

まだ機能がcb()で実行されていません。最後の例では、before(cb)beforeというコールバックがコールバックを呼び出します。

関連する問題