Обещания NodeJS: есть ли у меня проблема с состоянием гонки?

#javascript #node.js

#javascript #node.js

Вопрос:

У меня есть некоторый код, который запускается при возникновении события и вызывает интенсивный процессорный метод, который находит и создает блокировку / удержание доступной области информации, затем он блокирует это пространство

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

 function eventCode(params){
  findFreeSpace(params).then((details)=>{
     lockSelectedSpace(details);
  });  
}

function findFreeSpace(details){
   //cpu itensive operation here
   resolve({success:true});
} 

function lockSelectedSpace(details){
  // lock the free space
}
  

Мой вопрос в том, когда запустится lockSelectedSpace?, запускается ли он сразу, когда findFreeSpace вызывает resolve?, или есть задержка?

Я спрашиваю, потому что важно, чтобы lockSelectedSpace выполнялся в findFreeSpace, и два пользователя не могут заблокировать одно и то же пространство

Спасибо

Комментарии:

1. Мне кажется, что Promise.all() может помочь в этой ситуации.

2. Возврат обещания не делает задачу с интенсивным использованием процессора асинхронной. Вы действительно делаете что-то асинхронное в этой задаче с интенсивным использованием процессора? Или просто завернуть результат в обещание?

Ответ №1:

lockSelectedSpace будет выполняться, как только findFreeSpace обещание будет успешно выполнено. Когда вы помещаете эту функцию внутри .then функции, вы явно ожидаете разрешения обещания перед запуском lockSelectedSpace . Можете ли вы привести пример того, что вы считаете условием гонки?

Ответ №2:

Да, как только обещание будет выполнено, оно выполнит функции, зарегистрированные через then . Из документов MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promis

Ожидающее обещание может быть либо выполнено со значением, либо отклонено по причине (ошибка). Когда происходит любой из этих вариантов, вызываются связанные обработчики, поставленные в очередь методом then обещания. (Если обещание уже выполнено или отклонено при подключении соответствующего обработчика, обработчик будет вызван, поэтому между завершением асинхронной операции и подключением ее обработчиков нет условия гонки.)

Ответ №3:

Если функция find free space имеет тип блокировки, то все задачи findFreeSpace будут выполняться раньше, а затем все lockSelectedSpace .

JavaScript — это однопоточная среда, в однопоточной среде одновременно может выполняться только один раздел кода, так что не волнуйтесь.

 let find = 0
let lock = 0

function findFreeSpace(i){
    //cpu intensive operation here
    return new Promise(resolve => {
        find = find  1
        console.log("[find, lock, i]:",find, lock, i)
        const interactions = Math.floor((Math.random() * 1000000000)   1)
        for(let x = 0; x<= interactions; x  ){}
        find = find -1
        resolve(i)
    })
}
function lockSelectedSpace(i){
    lock = lock  1
    console.log("[find, lock, i]:",find, lock, i)
    lock = lock -1
}

function eventCode(i){
    findFreeSpace(i).then((i)=>{
        lockSelectedSpace(i)
    })
}

for(let i =0; i< 100; i  ){
    eventCode(i)
}