Java中有Promise和@@ iterator的问题

问题描述 投票:2回答:2

我是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

您能帮我修复它吗?谢谢

javascript node.js debugging promise
2个回答
2
投票

您正在执行...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


0
投票

您可以使用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可以识别迭代器,并且不会出错。

© www.soinside.com 2019 - 2024. All rights reserved.