Promise.all结合对象映射返回undefined问题求助
问题分析与修复方案
我来帮你梳理下代码里导致控制台输出Unsubscribed Results => undefined的几个关键问题:
问题1:未返回Promise.all到then链中
第一个.then()的回调函数里,你创建了Promise.all但没有把它return出去。Promise的then链中,如果回调函数没有返回值,会默认返回一个resolved为undefined的Promise,这就导致下一个then接收的参数直接是undefined。
问题2:map回调未返回Promise
你在map里用了带大括号的箭头函数(key, index) => { ... },这种写法下必须显式使用return才能返回值。现在你的map实际上生成了一个全是undefined的数组,Promise.all处理这个数组会直接resolve为undefined数组,更重要的是tools.unsubscribe的Promise根本没被加入等待队列,相当于没正确等待这些异步操作完成。
另外,这里用index取results[index]是错误的——Object.keys(results)返回的是对象的键名数组,results[key]才是对应的值,index只是数组的索引,和对象键没有对应关系。
问题3:变量名拼写错误
第二个then的参数是unsubscribe,但你console.log里写的是unsubscribed,这会导致该变量未定义(不过你当前打印的是undefined,可能是调试时调整过,但还是要修正)。
修复后的代码
tools.isMember(userid) .then(results => { // 返回Promise.all,让then链能接收它的resolve结果 return Promise.all( // 用key直接取对应值,去掉不必要的index,用简洁箭头函数自动返回Promise Object.keys(results).map(key => tools.unsubscribe(results[key], userid)) ) }) .then(unsubscribedResults => { // 变量名保持一致 console.log('Unsubscribed Results => ', unsubscribedResults); }) .catch(err => console.log(err));
额外优化建议
如果你的环境支持async/await,用它可以让代码更易读、更直观:
try { const results = await tools.isMember(userid); const unsubscribedResults = await Promise.all( Object.keys(results).map(key => tools.unsubscribe(results[key], userid)) ); console.log('Unsubscribed Results => ', unsubscribedResults); } catch (err) { console.log(err); }
内容的提问来源于stack exchange,提问作者Someone Special
相关产品推荐
相关产品推荐

