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()
    函数将返回生成器
    函数*
    的迭代器对象,而
    异步
    函数将返回封装在承诺中的数组

  • 如果从生成器调用中获取值后未将任何值传递给迭代器.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)不,它们不完全相同,区别如下:

  • 调用的
    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是好的,但是我更喜欢回调到生成器)。