gpt4 book ai didi

javascript - 为什么不会从 `.map` 回调中产生返回?

转载 作者:IT老高 更新时间:2023-10-28 23:02:27 26 4
gpt4 key购买 nike

Learn Generators - 4 » CATCH ERROR!该解决方案使用 for 循环 但我在 MDN - Iteration Protocols 中找不到任何内容指的是回调中的 yield。

我猜答案只是不要那样做,但如果有人有时间或愿意提供解释,请提前感谢!

代码:

function *upper (items) {
items.map(function (item) {
try {
yield item.toUpperCase()
} catch (e) {
yield 'null'
}
}
}

var badItems = ['a', 'B', 1, 'c']

for (var item of upper(badItems)) {
console.log(item)
}
// want to log: A, B, null, C

错误:

⇒  learn-generators run catch-error-map.js
/Users/gyaresu/programming/projects/nodeschool/learn-generators/catch-error-map.js:4
yield item.toUpperCase() // error below
^^^^
SyntaxError: Unexpected identifier
at exports.runInThisContext (vm.js:73:16)
at Module._compile (module.js:443:25)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Function.Module.runMain (module.js:501:10)
at startup (node.js:129:16)
at node.js:814:3

连我的编辑都知道这是个糟糕的主意...

yield within callback

最佳答案

免责声明:我是 Learn generators 的作者研讨会者

@slebetman 的回答有点正确,我还可以补充:

是的,MDN - Iteration Protocol在回调中不直接引用 yield。但是,它会告诉我们您 yield 项的重要性,因为您只能在 generators 中使用 yield。见 MDN - Iterables文档以了解更多信息。

@marocchino suggest很好的解决方案迭代映射后更改的数组:

function *upper (items) {
yield* items.map(function (item) {
try {
return item.toUpperCase();
} catch (e) {
return null;
}
});
}

我们可以做到,因为Array有迭代机制,见Array.prototype[@@iterator]() .

var bad_items = ['a', 'B', 1, 'c'];

for (let item of bad_items) {
console.log(item); // a B 1 c
}

Array.prototype.map没有默认的迭代行为,因此我们无法对其进行迭代。

但是生成器不仅仅是迭代器。每个生成器都是一个迭代器,但反之则不然。生成器允许您通过调用 yield 关键字来自定义迭代(而不仅仅是)过程。你可以在这里玩一下,看看生成器/迭代器之间的区别:

演示:babel/repl .

关于javascript - 为什么不会从 `.map` 回调中产生返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30498103/

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