首页 > 解决方案 > Promise {pending},异步,等待Javascript

问题描述

我试图理解为什么这段代码会返回“Promise { pending }”。

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"]))

当我console.log(str)从 reduceDirections() 函数中可以看到我得到了我想要的结果。但是当我(一行之后)return str我有“未决的承诺”

很抱歉不理解 Promises 和 async await。我曾尝试在 mdn 上阅读并观看视频,但我不知道如何将它们显示的内容转移到这个问题上。提前感谢您的帮助!

标签: javascriptnode.jsasync-await

解决方案


几个问题:

1) 中没有任何异步发生reduceDirections,也没有返回一个承诺,所以await在它上面使用是没有意义的。

2)你的函数的递归部分不返回递归结果,所以改变:

 } else {
     reduceDirections(str)
 }  

至:

 } else {
     return reduceDirections(str)
 }  

那么至少你可以希望有一个有用的字符串作为返回值

3)如果你真的坚持使用await同步返回的东西,那么你可以保留它,但没有必要这样做

return Promise.resolve(res)

...因为async无论如何,函数总是返回一个承诺。所以就这样做

return res;

4)您不必等待承诺解决。所以你应该等待它的解析值并console.log使用。改变:

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

至:

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

但同样,在这里使用 Promise 是没有用的,只会使代码复杂化。你不会从中得到任何好处。


推荐阅读