Javascript .then()的优先级高于承诺之外的代码?

Javascript .then()的优先级高于承诺之外的代码?,javascript,es6-promise,Javascript,Es6 Promise,假设我们在异步函数中有一个承诺: (async function() { let x = 0; await new Promise((resolve, reject) => { setTimeout(() => resolve(), 2000) }) .then(res => { x = 100; }) console.log(x); })(); 控制台输出始终为100,从不为0。我在所有主流浏览器和Node.js中都试过了。这正

假设我们在异步函数中有一个承诺:

(async function() {

  let x = 0;

  await new Promise((resolve, reject) => {
    setTimeout(() => resolve(), 2000)
  })
  .then(res => {
    x = 100;
  })

  console.log(x);
})();
控制台输出始终为
100
,从不为
0
。我在所有主流浏览器和Node.js中都试过了。这正是我想要看到的,但我能感觉到它周围的代码气味。我不确定这是否是将值传递给
x
的安全方法。尽管我在它前面放了很多代码,但它似乎还是有效的。除非它是异步的(比如另一个
setTimeout()
),否则一切都好

有人能确认
.then()
分支是否实际优先并在
警报(x)
行之前运行,还是只是偶然发生的?


(是的,我知道有更好的方法可以做到这一点,但这是一个简化的概念验证片段。)

这是有保证的,因为
等待
块,直到承诺链完成。这是因为链接到原始承诺的
.then
会返回一个新承诺,而
wait
会对其进行操作

预期的行为是,console.log发生在函数开始运行(承诺被解析时)2秒后,x已经被分配(作为承诺链的一部分)

对于“代码气味”——我认为从承诺中返回状态并避免副作用更为干净。但是,考虑到有限的范围和保证的执行顺序……

是,此方法是“安全的”。您显式地
等待.then()代码块返回的承诺。如果您的承诺被拒绝(例如失败的网络请求),那么您的代码将被破坏,因此请确保在末尾添加一个.catch(错误)

顺便说一句,编写此代码的更简洁方式如下:

(异步函数(){
设x=0;
等待新的承诺((决定,拒绝)=>{
setTimeout(()=>resolve(),2000)
});
x=100;
控制台日志(x);
})();
如果您不需要来自承诺的返回值,那么此代码的行为方式与您的完全相同

编辑: 由于承诺确实应该提供价值,您可以将其改写为:

(异步函数(){
设x=0;
const res=等待新承诺((解决、拒绝)=>{
setTimeout(()=>resolve(100),2000)
});
x=分辨率;
控制台日志(x);
})();

您真正等待的承诺是
.then()
返回的承诺。这里没有“优先权”。诚然,这更为简洁,但其思想是承诺应提供x的值。在您的代码中,这只是一个延迟。