我试图理解为什么此代码返回“ Promise {未决}”。
const reduceDirections = (str) => {
str = str.replace(/northsouth|southnorth|eastwest|westeast/ig, '')
if (str.search(/northsouth|southnorth|eastwest|westeast/ig) === -1) {
str = str.replace(/south|north|west|east/gi, '$& ').replace(/(^\s+|\s+$)/,'')
console.log(str)
return str
} else {
reduceDirections(str)
}
}
async function start(arr) {
str = arr.join('')
let res = await reduceDirections(str)
return Promise.resolve(res)
}
console.log(start(["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]))
当我从reduceDirections()函数中console.log(str)
时,我可以看到我想要的结果。但是,当我(以后一行)return str
时,我却收到了“待处理的承诺”
很抱歉,我不了解Promises和async等待。我尝试过阅读mdn并观看视频,但是我看不到如何转移它们显示的问题。预先感谢您的帮助!
答案 0 :(得分:3)
几个问题:
1)reduceDirections
中没有异步事件发生,也不返回承诺,因此在其上使用await
毫无意义。
2)函数的递归部分不会返回递归结果,因此请更改:
} else {
reduceDirections(str)
}
收件人:
} else {
return reduceDirections(str)
}
那么至少您可以希望有一个有用的字符串作为返回值
3)如果您真的坚持对同步返回的内容使用await
,则可以保留它,但是没有必要这样做
return Promise.resolve(res)
...因为async
函数始终会返回诺言。所以就做
return res;
4)您不必等待 承诺解决。因此,您应该等待它的解析值,并在 that 上使用console.log
。更改:
console.log(start(["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]))
收件人:
start(["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]).then(console.log)
但是同样,在这里使用promises毫无用处,只会使代码复杂化。您不会从中获得任何好处。
答案 1 :(得分:-2)
摆脱return Promise.resolve(res)
行。异步函数仍然会返回一个承诺。
您在控制台(WEST)上看到的第一行来自reduceDirections函数中的console.log语句。
Promise {未决}是第二个console.log显示的内容,因为这是start函数的返回值。
关于Promise为何未决的问题实际上稍微有些有趣。这是因为,如果删除异步部分,则该函数是异步的,则会得到一个已解决的Promise,但是使用async神奇地将函数的返回值包装在一个Promise中,该Promise是待处理的,而不是通过调用Promise.resolve( )。