我有这个特殊的Promise链,然后是1。我希望第一个Promise运行并使用键控值填充对象。这很好。
然后我想要一个.then函数来执行,它会将一些值连接到原始对象。再次,这工作正常。
我的问题是在.then完成之前就已经解决了,这不是我想要的。我明白了。然后才会执行并最终在解决结算之前返回结果。如果我简化代码只是简单地连接它的工作值。我相信我的问题是.then中的第一个操作本身就是一个异步对象。我不知道如何让.then在返回结果之前等待binance.prevDay完成。
console.log输出如下所示:
Resolving
Resolved
฿0.00153400
entered
Exit฿0.00153400
$14
所有值都是我想要的,但我希望Resolved结束。
promise2 = new Promise((resolve, reject) => {
binance.prevDay(coin + `BTC`, (error, prevDay, symbol) => {
for (var obj in prevDay) {
if (obj.includes("priceChangePercent")) {
_add24h["24h Percent"] = new Number(parseFloat(prevDay[obj]).toFixed(2)) + `%`;
} else
if (obj.includes("priceChange")) {
_add24h["24h Change"] = `\u0E3F` + prevDay[obj]; // + `\n\$` + parseFloat(prevDay[obj]*_btcusdt).toFixed(2);
} else
if (obj.includes("highPrice")) {
_add24h["24h High"] = `\u0E3F` + prevDay[obj];
} else
if (obj.includes("lowPrice")) {
_add24h["24h Low"] = `\u0E3F` + prevDay[obj];
}
}
console.log("Resolving")
resolve(_add24h);
console.log("Resolved")
})
})
.then(function (result) {
binance.prevDay(coin + `USDT`, (error, prevDay, symbol) => {
for (var obj in prevDay) {
//console.log(prevDay[obj]);
if (obj.includes("priceChangePercent")) {
_add24h["24h Percent"] = prevDay[obj];
} else
if (obj.includes("priceChange")) {
console.log("entered")
_add24h["24h Change"] = _add24h["24h Change"] + "\n$" + new Number(parseFloat(prevDay[obj]).toFixed(2));
console.log("Exit" + _add24h["24h Change"])
}
}
})
console.log(_add24h["24h Change"])
return result;
})
答案 0 :(得分:0)
据我了解,这是预期的执行顺序。
在第一个promise中调用resolve()
并不一定立即执行then
处理程序(即,调用resolve不会将then
处理程序添加到调用堆栈中。)它将是排队等待执行,对resolve
的调用返回,并在promise处理程序中返回console.log("Resolved")
。 then
方法稍后会在下一个刻度线上执行。假设其他任何事情都没有排队。
然而,这只是我的肤浅理解,它可能取决于所使用的Promise的实现。
答案 1 :(得分:0)
调用.resolve()或.reject()是一个异步操作,它只是相关处理程序的信号,表明已经履行或拒绝了承诺。它并不一定意味着只有在then部分完成执行后才会执行下一行。
请阅读有关承诺的官方javascript文档,以便更好地理解: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
为了在结尾处有“已解决”,你应该将它放在then()链的末尾。
答案 2 :(得分:0)
重要的一点是:resolve
解决了承诺,而不是承诺链
您的代码中有两个承诺:
您使用new Promise
创建的那个以及使用.then
创建的那个
正如预期的那样,对resolve
的调用解决了第一个承诺。这是第二个承诺运行的先决条件。如果您不在第一个承诺上调用resolve
,.then
承诺将永远不会运行。
如果您希望代码在.then
之后运行,请将该代码附加到另一个.then
。