Javascript 如何预测承诺的异步性质

Javascript 如何预测承诺的异步性质,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,我有一段示例代码,无法预测代码流 var x = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve([1, 2, 3]); }, 0); }); }; x().then((val) => { console.log(val); }).catch((err) => { console.log(err.message);

我有一段示例代码,无法预测代码流

var x = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve([1, 2, 3]);
    }, 0);
  });
};

x().then((val) => {
  console.log(val);
}).catch((err) => {
  console.log(err.message);
});

console.log("hello");

for (var i = 0; i < 10; i++) {
  console.log(i);
}

var y = Promise.all([Promise.resolve(1), Promise.reject(Error("err"))]);

y.then((arr) => {
    console.log(arr);
  })
  .catch((err) => {
    console.log(err);
  });

Promise.resolve('ta-da!')
  .then((result) => {
    console.log('Step 2 received ' + result);
    return 'Greetings from step 2';
  })
  .then((result) => {
    console.log('Step 3 received ' + result);
  })
  .then((result) => {
    console.log('Step 4 received ' + result);
    return Promise.resolve('fulfilled value');
  })
  .then((result) => {
    console.log('Step 5 received ' + result);
    return Promise.resolve();
  })
  .then((result) => {
    console.log('Step 6 received ' + result);
  });
for循环正在按预期执行。 setTimeout()正在按预期工作,并且在事件循环后承诺已实现

其他两个承诺正在发生冲突。 我期待着承诺会立即同步兑现,结果会是

"hello"
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    "err"
    "Step 2 received ta-da!"
    "Step 3 received Greetings from step 2"
    "Step 4 received undefined"
    "Step 5 received fulfilled value"
    "Step 6 received undefined"
    [1, 2, 3].
即使承诺是异步解决的,它们又是如何冲突的呢

附上截图


我将回答设计点而不是像这样的空白测试:

promise的目标是并行地发出异步请求,如服务器请求

因此,解决这些问题的顺序将更多地取决于服务器的答案,而不是broswer上的javascript客户机循环

根据设计,任何临时请求的流程都是不可预测的。这适用于所有异步对象

因此,如果你需要先提出一个请求,然后再提出另一个请求,那么你需要先解决第一个承诺,然后再做另一个。如果您需要独立操作,比如说加载带有独立组件的仪表板,您可以同时触发所有异步请求。 无论解决顺序如何,您都不会遇到任何问题。在仪表板的情况下,您是否真的关心在显示完全独立信息的第二个组件之前加载第一个组件?当然不是


现在,如果你想知道它是如何在浏览器中实现的,我只想说,如果你改变broswer,它可能会改变,所以它完全不相关。您必须让javascript在多个浏览器上工作。

您的代码中有三个单独的承诺链:

  • x()
    开头并由于超时而占用时间最长的一个
  • 以抛出错误的
    y
    (来自
    Promise.all(…)
    )开头的
  • Promise.resolve('ta-da!')开头的一个
  • 他们不会等待对方——你没有告诉他们要等待,他们自己也不会神奇地等待。
    相反,它们的流是任意交错的,就像标准异步函数的情况一样(考虑两个具有不同周期的
    setInterval
    s)

    我原以为这些承诺会立即同步兑现


    不可以。承诺回调总是(可靠地)异步的,即使承诺已经解决。

    步骤3没有返回承诺,因此您的链被断开,其余的被移动到事件循环的下一个迭代(而不是安排另一个微任务立即执行)@MadaraUchiha Step 2也没有回复承诺。@thefourtheye你能解释一下为什么它们被破坏了。我觉得很好。日志也告诉我同样的情况。
    "hello"
        0
        1
        2
        3
        4
        5
        6
        7
        8
        9
        "err"
        "Step 2 received ta-da!"
        "Step 3 received Greetings from step 2"
        "Step 4 received undefined"
        "Step 5 received fulfilled value"
        "Step 6 received undefined"
        [1, 2, 3].