javascript 我的函数声明中哪一个更好?generator还是async/await?

gdrx4gfi  于 2023-05-21  发布在  Java
关注(0)|答案(2)|浏览(118)

我想写一个函数,但我不知道哪一个更好:

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

这两个都很好,我不知道哪一个更好,或者它们之间有什么区别。

fdbelqdn

fdbelqdn1#

不,它们并不完全相同,区别如下:
1.使用的call()调用返回生成器function*的迭代器对象,而async函数将返回 Package 在promise中的数组。
1.如果在从生成器调用中获取值后没有向iterator.next()调用传递任何值,则从生成器函数返回的结果数组将有四个undefined值。但是在async版本中,您将在Promise Package 的数组中获取从api()调用返回的值。
1.同样,yield语句也会在迭代器时返回值,但是在async函数中,await将等待api()调用返回的Promise被解析,然后移动到下一个await,否则如果值不是来自api()调用的Promise,则将其转换为已解析的Promise,并且await表达式将成为解析的Promise的值。
这三点可以通过下面的片段来说明。
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.异步功能:

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

        return [a, b, c, d];
    } catch (e) {
        console.log(e);
    }
}
//call() will return a Promise
call().then(data => console.log(data));
bfnvny8b

bfnvny8b2#

这被称为生成器函数btw。

function* call()

async/await和generator之间最重要的区别是,生成器是从Node.js 4.x一直支持的,而async/await需要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提供了一种更简洁的方法来处理并发。但是生成器函数提供了更大的灵活性。
选择取决于你想要实现什么,但在大多数情况下,如果你使用的是现代版本的NodeJs,那么使用async/await是有意义的。

相关问题