我试图理解以下代码:
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');
});
});
请告诉我,我的理解是否正确。 "前"是一个函数,它接受一个没有名称的函数作为一个称为匿名函数的参数。
该匿名函数被标记为async(),这意味着它将阻塞,直到它从服务器获得返回调用。
在初始化存储变量之前,匿名函数不会返回。
之前的函数被立即调用,因为它已在另一个函数中定义。
如果它是在另一个函数之外定义的,则不会被调用,除非在"之前的单词"写在另一个函数内。
此外,也会立即调用匿名函数,因为它是在另一个函数中定义的。
谢谢!
答案 0 :(得分:2)
一个简单说明:异步函数不阻止。它们基于promises,因此异步函数的执行在等待期间停止,它不会阻塞线程。这是他们如此有用的原因之一。
您的问题的答案是否定,函数,匿名或其他方式不会自动调用定义。
例如:
function test() {
() => console.log('hello')
}
除非您实际拨打test()
,否则不会记录。它是否在回调中也没关系。例如,我们可以编写一个名为before()
的函数:
function before(cb){
}
并传递一个匿名回调函数:
before(() => console.log("hello"))
它不会触发回调,因此从不记录控制台,显示定义没有任何反应。
但是,before()
通常会接受该回调并调用它:
function before(cb){
cb()
}
在使用cb()
在before函数内部实际调用函数之前,该函数仍未执行。在最后一个示例中,我们将调用before(cb)
,而before
将依次调用我们的回调。
答案 1 :(得分:1)
不,不会在定义上调用匿名函数。你所看到的只是一个函数表达式作为第一个参数传递给before
函数。
然后before
函数调用此函数作为稍后测试运行的一部分
传递给before
的函数完成后,“设置用户数据”测试将运行
这是因为测试框架在每次测试之前调用before
函数。
请注意,before
只是测试框架自己提供的一个函数,它没有特殊的语言功能。