gpt4 book ai didi

javascript - 我的函数声明中哪一个更好?生成器还是异步/等待?

转载 作者:行者123 更新时间:2023-11-28 14:15:09 24 4
gpt4 key购买 nike

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

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

这两个都很好用,不知道哪个更好,或者有什么区别。

最佳答案

不,它们并不完全相同,差异如下:

  1. call() 调用将返回生成器 function* 的迭代器对象,而 async 函数将返回您包裹在 promise 中的数组。

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

  3. 此外,当您迭代迭代器时,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);

  • 异步函数:
  • 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));

    关于javascript - 我的函数声明中哪一个更好?生成器还是异步/等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57839744/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com