JavaScript如何正确组合异步函数实现异步单词拼接后统计数量
问题修复方案
错误原因
- 直接触发语法报错的原因是你在
compose的参数列表中直接使用了(await addAsyncWord):await关键字只能在async函数内部使用,且你此处是对函数本身使用await,既不符合语法规则也不符合业务逻辑。 - 你原有实现的
compose是同步函数组合工具,无法处理异步函数返回的Promise对象,就算修复语法错误,后续的拆分、计数逻辑拿到Promise也无法正常执行。
修改方案
- 改写
compose2适配异步逻辑,每一步执行前先等待上一步的异步结果返回 - 移除
compose参数中非法的await关键字,直接传入异步函数即可 - 调用最终生成的
word函数时需要传入初始文本参数,补充兜底逻辑避免输入为undefined - 如果运行环境不支持顶层
await,可以把执行逻辑包在异步自执行函数中
完整可运行代码
const compose2 = (f, g) => async (...args) => f(await g(...args)) const compose = (...fns) => fns.reduce(compose2) const count = arr => arr.length // 加filter避免连续空格/首尾空格产生的空字符串被计数 const split = str => str.split(/\s+/).filter(Boolean) const addAsyncWord = async str => `${str} some words obtained asynchronously` // 兜底默认空字符串,避免无输入时报错 const read = text => text || '' const word = compose( count, split, addAsyncWord, read ) // 执行调用,传入初始文本 (async () => { console.log('word ->', await word('test initial content')) // 输出结果:word -> 7 (初始3个单词 + 异步返回的4个单词) })()
内容的提问来源于stack exchange,提问作者user2580401
相关产品推荐
相关产品推荐

