javascript中是否存在线程不安全的可能性?

javascript中是否存在线程不安全的可能性?,javascript,asynchronous,concurrency,Javascript,Asynchronous,Concurrency,让arr=[2,3] 让promiseA=新承诺((决议)=>{ //等待io 解析(arr.shift()) }) let promiseB=新承诺((决议)=>{ //等待io 解析(arr.shift()) }) let handler=(数据)=>{ 如果(!数据){ 返回console.log(“不再”) } console.log(数据) } 允诺人(经办人) promiseB.then(handler)@Pointy(在注释中)是正确的,但只是将其形式化: 承诺体、消息和事件循环

让arr=[2,3]
让promiseA=新承诺((决议)=>{
//等待io
解析(arr.shift())
})
let promiseB=新承诺((决议)=>{
//等待io
解析(arr.shift())
})
let handler=(数据)=>{
如果(!数据){
返回console.log(“不再”)
}
console.log(数据)
}
允诺人(经办人)
promiseB.then(handler)
@Pointy(在注释中)是正确的,但只是将其形式化:


承诺体、消息和事件循环 在两个
承诺体中运行的任何代码都将在主JavaScript中作为消息执行

JavaScript一次运行一条消息,一旦消息在主事件循环中运行,它将在任何其他事件发生之前:

…它不能被抢占,并且将在任何其他代码运行之前完全运行(并且可以修改函数操作的数据)

像主事件循环的
setTimeout
queue
messages
这样的调用,因此在两个
Promises
的主体中完成的工作可能跨越多条消息,但每条消息一次运行一条,并在其他任何消息运行之前一直运行到完成

因此,在每个承诺机构达到这一水平时:

resolve(arr.shift())
…它将是当前正在运行的消息,并且“不能被抢占,并且将在任何其他代码运行之前完全运行”


Promise回调和PromiseJobs队列 当
Promise
解析时,等待
Promise
的所有回调都会在中排队,这是ES6引入的特殊作业队列

PromiseJobs队列中的回调在当前消息完成之后和下一条消息开始之前运行,并按顺序一次运行一个回调,直到队列为空


那么…允诺人和允诺人是否有可能以2的值来解决? 否。两个
承诺
都将以
2
值解析的可能性为零

这一行:

resolve(arr.shift())
…是同步的,数组操作和
resolve
都将在运行任何其他代码之前作为当前运行消息的一部分运行到完成

这意味着每个
处理程序
回调都保证以唯一值在PromiseJobs中排队


奖金


在编写代码的方式中,
处理程序
保证首先以
2
的方式在PromiseJobs中排队,然后以
3
的方式在PromiseJobs中排队,无论哪个
承诺
首先解决,因此,
处理程序
回调保证按该顺序运行,并且上面的代码在打印
3

之前将始终打印
2
。编程模型是单线程的。一个承诺将在另一个承诺之前解决,所以这是存在的,但这不是真正的并发问题,而是一个同步问题。底线是,编写这样的代码可能不是一个好主意。输出可能是
3
,然后是
2
。不可能是
2
然后是
2
。让你的问题更有趣…下次使用Web Workers,创建多个流程并提出相同的问题。当然,答案仍然和波蒂所说的一样,但会是一个更有趣的问题!:-)