我想编写一个函数,但我不知道其中哪个更好:
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);
}
}
它们两者都工作良好,我不知道其中哪一个更好,或者它们之间有什么区别。
答案 0 :(得分:3)
不,它们并不完全相同,区别如下:
带有call()
的调用将为生成器function*
返回一个迭代器对象,而async
函数将返回一个包装在promise中的数组。
如果从生成器调用获取值后没有将任何值传递给iterator.next()
调用,则从生成器函数返回的结果数组将具有四个undefined
值。但是在async
版本中,您将获得Promise包装数组中api()
调用返回的值。
此外,yield
语句将在您迭代迭代器时返回值,但是在async
函数中,await
将等待{{ 1}}待解决的调用,然后继续下一个api()
,否则如果await
调用中的值不是Promise,则会将其转换为已解决的Promise,而api()
的值表达将成为已解决的Promise的价值。
这三个点可以在下面用一个片段说明。
await
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尤其有意义,但