2017-10-11 106 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(),這意味着它將阻塞,直到它從服務器獲得回調。 在存儲變量初始化之前,匿名函數將不會返回。 之前函數被立即調用,因爲它已被定義在另一個函數內。 如果它被定義在另一個函數之外,那麼它將不會被調用,除非在另一個函數中寫入「before」這個詞。
此外,匿名函數也會立即調用,因爲它是在另一個函數內部定義的。

謝謝!

+2

''之前'是一個接受函數的函數,不管它是否是匿名函數都沒關係,也沒有'async'函數不會阻塞,它們會讓您通過promise來理解調度。 – MinusFour

+0

「*除非單詞」之前「被寫入*」 - 這聽起來好像你相信'之前'是一個特殊的關鍵字。它不是,它只是一個通常的js函數,名稱爲'before'。其回調會發生什麼,完全取決於實施。它可以是'(cb){/ *什麼都不做* /}'之前的函數,或者(cb){setTimout(cb,50)之前的函數。/* later * /}',或'function before(cb){cb(); CB();/*兩次* /}'。 – Bergi

回答

1

不,匿名函數不在定義上調用。你所看到的僅僅是一個函數表達式,它被作爲第一個參數傳遞給函數before

before函數然後調用此函數作爲稍後測試運行的一部分。
在函數傳遞到before完成後將運行「設置用戶數據」測試,
這是因爲測試框架在每次測試之前調用before函數。

請注意,before只是測試框架提供的一個函數,它沒有特殊的語言功能。

2

一個快速提示:異步功能不要塊。它們基於promise,所以雖然異步函數的執行在await期間暫停,但它不會阻塞該線程。這是他們如此有用的原因之一。

您的問題的答案是否定的,函數,匿名或其他,不會自動調用定義。

例如:

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

這不記錄,除非你實際調用test()。如果它在回調中也沒關係。例如,我們可以編寫一個名爲before()功能:

function before(cb){ 
} 

,並把它傳遞一個匿名的回調函數:

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

它不火的回調,因此控制檯從未登錄顯示,在定義什麼也沒有發生。

但是通常會before()採取的回調,並調用它:

function before(cb){ 
    cb() 
} 

仍無法執行該功能,直到它實際上被稱爲前函數內部與cb()。在最後一個例子中,我們稱before(cb)before反過來調用我們的回調函數。