Promise {待处理},异步,用Javascript等待

我试图理解为什么此代码返回“ 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","EAST","WEST","NORTH","WEST"]))

当我从reduceDirections()函数中console.log(str)时,我可以看到我想要的结果。但是,当我(以后一行)return str时,我却收到了“待处理的承诺”

很抱歉,我不了解Promises和async等待。我尝试过阅读mdn并观看视频,但是我看不到如何转移它们显示的问题。预先感谢您的帮助!

h520zh 回答:Promise {待处理},异步,用Javascript等待

几个问题:

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","EAST","WEST","NORTH","WEST"]))

收件人:

start(["NORTH","WEST"]).then(console.log)

但是同样,在这里使用promises毫无用处,只会使代码复杂化。您不会从中获得任何好处。

,

摆脱return Promise.resolve(res)行。异步函数仍然会返回一个承诺。

您在控制台(WEST)上看到的第一行来自reduceDirections函数中的console.log语句。

Promise {未决}是第二个console.log显示的内容,因为这是start函数的返回值。

关于Promise为何未决的问题实际上稍微有些有趣。这是因为,如果删除异步部分,则该函数是异步的,则会得到一个已解决的Promise,但是使用async神奇地将函数的返回值包装在一个Promise中,该Promise是待处理的,而不是通过调用Promise.resolve( )。

本文链接:https://www.f2er.com/3144155.html

大家都在问