我的函数声明哪一个更好?发电机还是异步/等待?

时间:2019-09-08 06:45:09

标签: 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);
    }
}

异步/等待

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);
    }
}

它们两者都工作良好,我不知道其中哪一个更好,或者它们之间有什么区别。

2 个答案:

答案 0 :(得分:3)

不,它们并不完全相同,区别如下:

  1. 带有call()的调用将为生成器function*返回一个迭代器对象,而async函数将返回一个包装在promise中的数组。

    < / li>
  2. 如果从生成器调用获取值后没有将任何值传递给iterator.next()调用,则从生成器函数返回的结果数组将具有四个undefined值。但是在async版本中,您将获得Promise包装数组中api()调用返回的值。

  3. 此外,yield语句将在您迭代迭代器时返回值,但是在async函数中,await将等待{{ 1}}待解决的调用,然后继续下一个api(),否则如果await调用中的值不是Promise,则会将其转换为已解决的Promise,而api()的值表达将成为已解决的Promise的价值。

这三个点可以在下面用一个片段说明。

  1. 发电机功能:

await

  1. 异步功能:

function* call() {
    try {
        const a = yield 1;
        const b = yield 2;
        const c = yield 3;
        const d = yield 4;

        return [a, b, c, d];
    } catch (e) {
        console.log(e);
    }
}
const itr = call();
//next() is not invoked with any params so the variables a, b, c, d will be undefiend
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); 

答案 1 :(得分:1)

这称为生成器函数btw。

 function* call()
  

异步/等待和生成器之间最重要的区别是   一直到Node.js一直都支持生成器   4.x,而异步/等待则需要Node.js> = 7.6.0。但是,鉴于Node.js 4.x已到使用寿命,并且Node.js 6.x将   将于2019年4月停产,这种差异正迅速成为   不相关的。   来源:https://thecodebarbarian.com/the-difference-between-async-await-and-generators

Aysnc / Await提供了一种更简洁的并发处理方法。但是生成器功能提供了更大的灵活性。

选择取决于您要实现的目标,但是在大多数情况下,如果您正在使用现代版本的NodeJ,则使用async / await尤其有意义,但