#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)
}