为何变量savedCards在第二个Promise中未定义?技术咨询
嘿,我来帮你拆解下这个问题,大概率是这几个常见原因之一:
最可能:变量拼写错误
看你代码里第二个then的console.log写了console.log(savedCar...,是不是手滑把savedCards写成了savedCard(少了末尾的s)?如果是这样,浏览器会把它当成全新的未声明变量,自然会显示undefined。这种小失误在写代码时真的太常见了😂。Promise链的传递逻辑误解
虽然savedCards是函数作用域的变量,但如果你在第一个then的回调里没有正确处理异步逻辑,或者中间有其他代码意外重置了它?不过从你的代码结构来看,Promise链式调用是顺序执行的——第一个then的回调执行完毕后才会触发第二个then,所以这个可能性比较低。属性名拼写错误
你在第一个then里给savedCards赋值的是value.saveCard,但前面处理的是value.saves,会不会这里应该是value.saves?如果value.saveCard本身就是undefined,那第一个then里的console.log其实输出的是undefined?不过你说第一个Promise里有有效值,这个可能不成立,但还是可以检查下这个属性名是否正确。作用域被遮蔽
如果你在第二个then的回调里,不小心用let或const重新声明了savedCards,就会把外部函数作用域的变量给遮蔽掉,导致访问到的是新的未赋值变量,自然显示undefined。
给你个小优化建议
为了避免这种作用域相关的坑,你可以把savedCards通过Promise链传递,而不是依赖函数作用域的变量:
saveCard(eCard: IEcards) { var savedCards: IEcards[] = []; this.storage.get("key").then((value) => { if (value.saves == undefined) { value.saves = savedCards; } savedCards = value.saveCard; // 务必确认这个属性名正确哦 console.log(savedCards); return savedCards; // 把值返回给下一个then }).then((savedCards) => { console.log(savedCards); // 直接接收上一个then返回的值,逻辑更清晰可靠 }); }
这样就不用纠结作用域的问题,代码逻辑也更直观~
内容的提问来源于stack exchange,提问作者Kumaran Raj K

