我是Promise
对象的新手。当我在NodeJS
function solution(num){
return getData(num).then(getMax);
}
function getData(num){
return Promise.resolve({
first: 80 * num,
second: 30 * num
});
}
function getMax(numbers){
return Promise.resolve(Math.max(...numbers));
}
solution(10)
我遇到错误
(node:7814)UnhandledPromiseRejectionWarning:TypeError:Found不可致电@@ iterator在getMax
您能帮我修复它吗?谢谢
您正在执行...numbers
,它期望numbers
是可迭代的,但在您的情况下,它是对象
尝试使其成为数组(或任何可迭代的,它应该可以工作)
function solution(num){
return getData(num).then(getMax);
}
function getData(num){
return Promise.resolve([80 * num, 30 * num]);
}
function getMax(numbers){
return Promise.resolve(Math.max(...numbers));
}
solution(10).then(console.log)
如果您想修改原始代码,请阅读此comment
您可以使用generator函数来修复迭代器错误。 JavaScript对象与Arrays,Sets和Maps不同,它们不带有Symbol.iterator
属性。许多内置函数,包括Math.max
,将基于Symbol.iterator
属性识别迭代器。您可以通过使用其值的生成器将对象转换为迭代器。
function solution(num){
return getData(num).then(getObjectValuesIterator).then(getMax);
}
function getObjectValuesIterator(obj){
return (function*() {
for (const key in obj) {
yield obj[key]
}
})()
}
function getData(num){
return Promise.resolve({
first: 80 * num,
second: 30 * num
});
}
function getMax(numbers){
return Promise.resolve(Math.max(...numbers));
}
solution(10).then(console.log) // => 800
getObjectValuesIterator
返回基于生成器函数的迭代器。 Math.max
可以识别迭代器,并且不会出错。