javascript - 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 上阅读并观看视频,但我不知道如何将它们显示的内容转移到这个问题上。提前感谢您的帮助!
解决方案
几个问题:
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 是没有用的,只会使代码复杂化。你不会从中得到任何好处。
推荐阅读
- html - 为什么页脚中的链接不起作用?
- azure-devops - 是否可以在 VSTS 上为不同的环境(阶段)共享任务?
- .net - EndSave(AutoCAD)是什么(.net vb)的成员?
- c# - 比较输入字符串的格式是否正确
- php - PHP 创建 ECDSA 签名并使用 Golang 进行验证
- apache-kafka - Kafka 在一个主题中流式传输多个对象并反序列化
- git - KDiff3 中的 A(基础)、B(本地)、C(远程)与 git 冲突解决程序有什么关系?
- c++ - NPM 安装:找不到平台工具集 = v141
- java - 发布在 Facebook Java Android 上
- json - 用冒号从 Javascript 中的 JSON 对象读取属性