Javascript中promise和@iterator存在问题
我对Javascript中promise和@iterator存在问题,javascript,node.js,debugging,promise,Javascript,Node.js,Debugging,Promise,我对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
对象是新手。当我在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)
我面对错误
(节点:7814)未处理的PromisejectionWarning:TypeError:Found
不可调用的@迭代器
在getMax
你能帮我修一下吗?
谢谢您正在做的…numbers
期望numbers
是可编辑的,但在您的情况下,它是对象
试着把它做成一个数组(或任何可编辑的),它应该可以工作
函数解决方案(num){
返回getData(num),然后返回getMax;
}
函数getData(num){
返回承诺。解决([80*num,30*num]);
}
函数getMax(数字){
返回Promise.resolve(Math.max(…数字));
}
解决方案(10)。然后(console.log)
如果您想修复原始代码,请阅读本节。您可以使用生成器函数修复迭代器错误。JavaScript对象与数组、集合和映射不同,它们没有符号.iterator
属性。许多内置函数,包括Math.max
将基于Symbol.iterator
属性识别迭代器。可以使用对象值生成器将对象转换为迭代器
函数解决方案(num){
返回getData(num)。然后返回getObjectValuesIterator。然后返回getMax;
}
函数getObjectValuesIterator(obj){
返回(函数*(){
用于(obj中的常量键){
屈服对象[键]
}
})()
}
函数getData(num){
还愿({
第一:80*num,
秒:30*num
});
}
函数getMax(数字){
返回Promise.resolve(Math.max(…数字));
}
解决方案(10)。然后(console.log)/=>800
getObjectValuesIterator
基于生成器函数返回迭代器Math.max
识别迭代器并且不会出错。您看到的问题是:
return getData(num).then(getMax);
在这种情况下,来自getData
的成功回调将返回一个对象,您将该对象传递到getMax
正确的方法是:
return getData(num).then((result) => getMax(Object.values(result));
添加solution(10).catch(console.log)
,您将看到您不应该在这里使用承诺的问题。您所做的一切都是同步的。或者在不更改getData
的情况下,您可以执行…Object.values(number)
您可以在不更改getData和getMax的情况下修复它吗?