如何将多个DeveloperInterface实例code方法的Promise结果拼接为单字符串?
问题
函数getDev接收DeveloperInterface类型的实例数组,每个实例的code方法返回Promise<String>。需求是调用每个实例的code方法,将所有返回结果拼接成单个字符串后返回。目前能输出每个code方法的单独结果,但无法完成拼接,相关代码如下:
async function getDev(developers: Array<DeveloperInterface>) { try { var newString: string = ""; developers.map((developer: any) => { developer.code().then((result: any) => { return new Promise(function(resolve) { resolve(newString.concat(result)); }); }); }) console.log(newString); } catch (error) { return "Error"; } }
解决思路
- 原代码核心问题:一是未等待异步操作完成,
map内的异步回调会在console.log(newString)执行后才触发,此时newString还是初始空值;二是concat返回新字符串,不会修改原newString,所以即使回调执行了也无法更新变量。 - 正确实现步骤:
- 收集所有
developer.code()返回的Promise,形成Promise数组; - 用
await Promise.all()等待所有Promise完成,拿到所有异步结果组成的数组; - 用数组
join('')方法拼接所有结果为单个字符串; - 在
async函数内必须用await才能获取异步操作的结果,否则无法拿到正确值。
- 收集所有
修正后的代码
async function getDev(developers: Array<DeveloperInterface>) { try { // 收集所有code方法的Promise实例 const promiseList = developers.map(developer => developer.code()); // 等待所有异步任务完成,获取结果数组 const codeResults = await Promise.all(promiseList); // 拼接所有结果字符串 const finalString = codeResults.join(''); console.log(finalString); return finalString; } catch (error) { console.error('执行出错:', error); return "Error"; } }
内容的提问来源于stack exchange,提问作者Dawienchi
相关产品推荐
相关产品推荐

