JavaScript Promise then() 排序

标签 javascript promise

我还在学习 JavaScript Promise,我遇到了一个我不明白的行为。

var o = $("#output");
var w = function(s) {
    o.append(s + "<br />");
}

var p = Promise.resolve().then(function() {
    w(0);
}).then(function() {
    w(1);
});

p.then(function() {
    w(2);
    return new Promise(function(r) {
        w(3);
        r();
    }).then(function() {
        w(4);
    });
}).then(function() {
    w(5);
});

p.then(function() {
    w(6);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="output"></div>

我希望这些语句按顺序运行——也就是说,输出是

0
1
2
3
4
5
6

相反,输出是

0
1
2
3
6
4
5

即使删除内部 Promise 也会给出在我看来是矛盾的结果。 12之前输出,但是65之前输出。

有人能给我解释一下吗?

我注意到,每次重新分配 p 都会为我们提供我期望的顺序。

最佳答案

您早早看到 6 的原因是因为您没有链接,而是分支。

当您调用 p.then().then().then() 时,您得到了一个 必须 以正确顺序执行的 promise 链。
但是,如果您调用 p.then().then(); p.then(),你有 2 个 promise 附加到 p - 本质上是创建一个分支,第二个分支将与第一个分支一起执行。

你可以通过确保将它们链接在一起来解决这个问题 p = p.then().then(); p.then();

仅供引用,您几乎从不想分支,除非您将它们重新组合在一起(例如 Promise.all),或者有意创建一个“即发即弃”分支。

关于JavaScript Promise then() 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29111626/

相关文章:

javascript - 在 promise 链中访问先前履行的 promise 结果

javascript - 如何检查文件是否存在于带 Angular url中?

javascript - 带空格的可动态 json 数据

javascript - 创建具有高度调整的垂直切换

javascript - 将 <a> 插入由带有 javascript 或 jQuery 的插件生成的 div

javascript - 如何使用闭包在循环中使用 then()

javascript - 排序两个异步操作的正确方法,每个异步操作返回一个 promise javascript

javascript - Javascript 类中的 Promise 和 nightJS

javascript - HERE map 按 ID 查找标记问题

javascript - Object.assign 和 just assign 的区别