есть ли вероятность небезопасности потока в javascript? - PullRequest
0 голосов
/ 20 марта 2019

let arr = [2, 3]

let promiseA = new Promise((resolve)=>{
    // await for io
    resolve(arr.shift())
})
let promiseB = new Promise((resolve)=>{
    // await for io
    resolve(arr.shift())
})
let handler = (data)=>{
    if(!data){
        return console.log("no more")
    }
    console.log(data)
}
promiseA.then(handler)
promiseB.then(handler)

Здравствуйте, у меня есть вопрос о совпадении в javascript.

Если promiseA и promiseB будут разрешены один за другим, будетнет проблем тогда.

Но, если две операции io занимают одно и то же время, есть ли вероятность, что и promiseA, и promiseB будут разрешены со значением 2?

1 Ответ

0 голосов
/ 20 марта 2019

@ Pointy (в комментариях) правильно, но только для его формализации:


Тело обещания, сообщения и цикл событий

Любой код, который выполняется в телеиз двух Promises будут выполняться как сообщения в главном цикле JavaScript Event Loop .

JavaScript запускает по одному сообщению за раз, и как только сообщение выполняется в основном цикле событий, он будет выполнить до завершения до того, как что-либо еще произойдет:

... его нельзя прервать и он будет работать полностью до запуска любого другого кода (и может изменять данные, которыми манипулирует функция).

Вызывает как setTimeout очередь messages для основного цикла событий, поэтому работа, выполняемая в теле двух Promises, может охватывать несколько сообщений, но каждое сообщение выполняется по одномувремя и выполнение до завершения, прежде чем что-либо еще выполнится.

Таким образом, в то время, когда каждое тело обещания достигает этой строки:

resolve(arr.shift())

... это будет текущее запущенное сообщение и "не можетбыть упрежденным и будет работать полностью передвыполняется любой другой код ".


Обратные вызовы Promise и очередь PromiseJobs

Когда Promise разрешается, любые обратные вызовы, ожидающие на Promise, ставятся в очередь в Очередь PromiseJobs , которая представляет собой специальную очередь заданий, представленную в ES6.

Обратные вызовы в очереди PromiseJobs запускаются после завершения текущего сообщения и до начала следующего сообщения и запускаются по одному за раз, по порядку, пока очередь не опустеет.


Итак ... есть ли вероятность того, что promiseA и promessB будут разрешены со значением 2?

Нет.Существует нулевая вероятность того, что оба значения Promises разрешатся со значением 2.

Эта строка:

resolve(arr.shift())

... является синхронной, и операция массива и resolveоба будут выполняться до конца как часть текущего запущенного сообщения перед выполнением любого другого кода.

Это означает, что каждый обратный вызов handler гарантированно ставится в очередь в PromiseJobs с уникальным значением.


Бонус

При написании кода handler гарантированно ставится в очередь в PromiseJobs сначала с 2, а затем в очереди в PromiseJobs с 3впоследствии независимо от того, какой Promise разрешает сначала , поэтому обратные вызовы handler гарантированно будут выполняться в таком порядке, и приведенный выше код будет всегда печатать 2 до того, как он напечатает 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...