javascript - Javascript 中的 Promise {pending}、async、await

标签 javascript node.js async-await

我试图理解为什么这段代码返回“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"]))

当我从reduceDirections()函数中console.log(str)时,我可以看到我得到了我想要的结果。但是当我(一行后)return str时,我改为“Promise未决”

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

最佳答案

几个问题:

1) reduceDirections 中没有发生任何异步操作,也不会返回 Promise,因此对其使用 await 没有任何意义。

2)函数的递归部分不返回递归结果,因此更改:

 } else {
     reduceDirections(str)
 }  

至:

 } else {
     return reduceDirections(str)
 }  

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

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

return Promise.resolve(res)

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

return res;

4) 你不会等待那个 promise 得到解决。因此,您应该等待它的解析值并对其使用 console.log。变化:

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

至:

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

但同样,使用 Promise 在这里毫无用处,只会使代码变得复杂。你不会从中得到任何好处。

关于javascript - Javascript 中的 Promise {pending}、async、await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58750631/

相关文章:

node.js - 使用 Passport 和 Passport-azure-ad 时没有刷新 token

c# - 等待任务完成

javascript - 启动带参数的函数

javascript - 如何在angularjs中自动填写输入字段?

javascript - 无法使用 .hide() 隐藏灯箱

javascript - 将扩展子句添加到 BreezeJS 查询后,EntityAspect 属性仍然无效

带数组的 Javascript 模块模式

sql - 根据连接表中的多次出现从数据库中选择

javascript - `await` 慢于 Chrome 中应有的速度

c# - 控制台应用程序和异步等待示例正在阻塞