Javascript 我的函数声明中哪一个更好?生成器还是异步/等待?
我想写一个函数,但不知道哪一个更好:Javascript 我的函数声明中哪一个更好?生成器还是异步/等待?,javascript,ecmascript-6,async-await,generator,Javascript,Ecmascript 6,Async Await,Generator,我想写一个函数,但不知道哪一个更好: function* call() { try { const a = yield api(1); const b = yield api(2); const c = yield api(3); const d = yield api(4); return [a, b, c, d]; } catch (e) { console.log(e);
function* call() {
try {
const a = yield api(1);
const b = yield api(2);
const c = yield api(3);
const d = yield api(4);
return [a, b, c, d];
} catch (e) {
console.log(e);
}
}
或异步/等待:
async function call() {
try {
const a = await api(1);
const b = await api(2);
const c = await api(3);
const d = await api(4);
return [a, b, c, d];
} catch (e) {
console.log(e);
}
}
这两个函数都很好,我不知道哪一个更好,或者它们之间有什么区别。这就是所谓的生成函数
function* call()
异步/等待和生成器之间最重要的区别是
生成器在返回Node.js的过程中一直受到本机支持
而async/await要求Node.js>=7.6.0。但是,考虑到Node.js 4.x已经到了生命周期的尽头,Node.js 6.x将继续使用
2019年4月达到寿命终点时,这种差异正在迅速扩大
无关的
资料来源:
Aysnc/Await提供了一种更简洁的处理并发性的方法。但生成器功能提供了更大的灵活性
选择取决于您想要实现什么,但在大多数情况下,使用async/Wait是有意义的,特别是如果您使用的是现代版本的NodeJs,但这被称为生成器函数btw
function* call()
异步/等待和生成器之间最重要的区别是
生成器在返回Node.js的过程中一直受到本机支持
而async/await要求Node.js>=7.6.0。但是,考虑到Node.js 4.x已经到了生命周期的尽头,Node.js 6.x将继续使用
2019年4月达到寿命终点时,这种差异正在迅速扩大
无关的
资料来源:
Aysnc/Await提供了一种更简洁的处理并发性的方法。但生成器功能提供了更大的灵活性
选择取决于您想要实现什么,但在大多数情况下,使用async/Wait是有意义的,特别是如果您使用的是现代版本的NodeJ,但它们并不完全相同,区别如下:
call()
函数将返回生成器函数*
的迭代器对象,而异步
函数将返回封装在承诺中的数组async
版本中,您将从Promise-wrapped数组中的api()
调用返回值yield
语句也会返回值,但是在async
函数中,await
将等待api()
调用返回的承诺得到解决,然后继续下一个await
否则,如果该值不是来自api()的承诺
call将其转换为已解析承诺,await
表达式的值将成为已解析承诺的值函数*call(){
试一试{
常数a=收益率1;
常数b=收益率2;
常数c=收益率3;
常数d=产量4;
返回[a、b、c、d];
}捕获(e){
控制台日志(e);
}
}
常量itr=call();
//next()不使用任何参数调用,因此变量a、b、c、d将是未定义的
console.log(itr.next().value);
console.log(itr.next().value);
console.log(itr.next().value);
console.log(itr.next().value);
console.log(itr.next().value)代码>不,它们不完全相同,区别如下:
调用的call()
函数将返回生成器函数*
的迭代器对象,而异步
函数将返回封装在承诺中的数组
如果从生成器调用中获取值后未将任何值传递给迭代器.next()
调用,则从生成器函数返回的结果数组将有四个未定义的值。但是在async
版本中,您将从Promise-wrapped数组中的api()
调用返回值
yield
语句也会返回值,但是在async
函数中,await
将等待api()
调用返回的承诺得到解决,然后继续下一个await
否则,如果该值不是来自api()的承诺
call将其转换为已解析承诺,await
表达式的值将成为已解析承诺的值函数*call(){
试一试{
常数a=收益率1;
常数b=收益率2;
常数c=收益率3;
常数d=产量4;
返回[a、b、c、d];
}捕获(e){
控制台日志(e);
}
}
常量itr=call();
//next()不使用任何参数调用,因此变量a、b、c、d将是未定义的
console.log(itr.next().value);
console.log(itr.next().value);
console.log(itr.next().value);
console.log(itr.next().value);
console.log(itr.next().value)代码>使用yield
当您可以使用wait
时,我认为这似乎很奇怪。如果api
只返回承诺,那么代码的读者会想知道生成器的用途是什么,他们不返回不同的东西吗?我认为生成器只会在第一次调用时返回部分结果。它是如何工作的?@D_N生成器可用于实现async/await(例如,如果async/await不可用,如2015年),如果您使用蹦床(例如通过co
模块)调用函数。但是,既然我们现在有异步/等待,我会认为它是一种反模式(虽然它对于2015是好的,但是我更喜欢回调到生成器)。