我可以访问变量' savedCards'从第一个承诺,它有一些价值。在第二个承诺中,它是未定义的,但是变量' eCard'有价值。请解释一下为什么?
saveCard(eCard: IEcards) {
var savedCards: IEcards[] = [];
this.storage.get("key").then((value) => {
if (value.saves == undefined) {
var saves = savedCards;
value.saves = saves;
}
savedCards = value.saveCard; // have value and can be accessed
console.log(savedCards);
}).then((data) => {
console.log(savedCards); // savedCards is undefined but eCard.id has value
this.globalProvider.IsCardExist(eCard.id, savedCards).then((data) => {
if (!data.response) {
this.globalProvider.AddEcardToStorage("saves", eCard);
}
});
});
}
答案 0 :(得分:0)
当您需要访问链中的中间值时,您应该将链条拆分成您需要的那些单件。而不是附加一个回调并以某种方式尝试多次使用其参数,将多个回调附加到同一个承诺 - 无论您需要结果值的哪个位置。
function getExample() {
var a = promiseA(…);
var b = a.then(function(resultA) {
// some processing
return promiseB(…);
});
return Promise.all([a, b]).then(function([resultA, resultB]) {
// more processing
return // something using both resultA and resultB
});
}
[编辑]
你想知道为什么,这就是答案:ES6带有生成器函数,它允许在任意放置的yield关键字中分解执行。这些切片可以相互独立地运行,甚至是异步运行 - 而这正是我们在运行下一步之前等待promise解析时所做的事情。
您的代码正在解决第一个承诺之前的第二个承诺。您无法通过使用“then()”确保您的代码可以按您的方式工作。如果你想要一个同步分辨率,你应该采取另一种方式。
[编辑2]
尝试使用等待并查看您是否能够解决问题。更多信息:http://2ality.com/2017/08/promise-callback-data-flow.html