【发布时间】:2018-06-30 01:30:38
【问题描述】:
这完全可能是我误解了 async/await 在 Javascript 中的工作方式,但我还没有弄明白。
我有一个简单的测试,它在实际运行测试之前使用一些帮助器生成模拟数据。
这里是辅助函数:
async create(numCustomers, businessId, options) {
options = _.assign({ type: 'customer' }, options);
const customers = await Factory.createMany('user', options, numCustomers);
return Promise.all(customers.map(async (c) => {
await AccountHelper.create(businessId, c.get('id'));
return c;
}));
}
这里有两个版本的测试:
async/await版本:
const customers = await CustomerHelper.create(10, Constants.fakeBusinessId);
await Promise.all(customers.map(async (c) => {
await PetHelper.create(1, c.get('id'));
}));
const res = await server.inject(request);
expect(res.statusCode).to.equal(200);
.then() 版本:
CustomerHelper.create(10, Constants.fakeBusinessId).then(async (customers) => {
await Promise.all(customers.map(async (c) => {
await PetHelper.create(1, c.get('id'));
}));
const res = await server.inject(request);
expect(res.statusCode).to.equal(200);
});
.then() 版本在大约 2 秒内完成,async/await 版本在近 7 秒内完成。这两种形式之间的变化似乎是唯一的变量。
我在 OSX 上运行 Node 8.9.4。
我感谢任何见解或教育:)
【问题讨论】:
-
可能一种形式并行运行,另一种形式顺序运行。
-
您的 await 版本必须在运行测试之前创建所有客户,而您的 then 方法在每个客户返回后立即运行,因此更加并行。
-
@Turksarama - 这意味着
.then被多次调用 -
不,然后为每个客户调用一次您传入其中的函数。
-
嗯,函数调用是一种简化,因为实际发生的情况是有一条管道正在建立,客户作为生成器。它更像是 Javascript(或者更确切地说,您的 Javascript 引擎)可以看到您正在传递一些可以生成值的东西,然后调用一个映射这些值的函数,以便它可以在引擎盖下将它们优化成一个更长的函数值而不是生成器本身。
标签: javascript