节点承诺链解析不等待。然后

时间:2018-04-11 05:05:23

标签: javascript node.js

我有这个特殊的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;
    })

3 个答案:

答案 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