我有一些在事件发生时运行的代码,并调用CPU密集型方法,该方法在可用的信息区域中查找并创建锁定/保持,然后锁定该空间
为了使这种不阻塞的CPU密集型方法通过返回一个promise来异步运行,然后promise。然后代码块使用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上运行很重要,并且两个用户不可能锁定相同的空间
谢谢
答案 0 :(得分:0)
lockSelectedSpace
将在findFreeSpace
成功解决承诺后立即运行。当您将此函数放置在.then
函数内部时,您明确地在运行lockSelectedSpace
之前等待承诺解决。您能提供一个您认为是比赛条件的例子吗?
答案 1 :(得分:0)
是的,诺言一旦解决,它将执行通过then
注册的功能。来自MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promis
未完成的承诺可以用值实现,也可以用原因(错误)拒绝。当这些选项中的任何一个发生时,将被promise的then方法排队的相关处理程序被调用。 (如果附加了相应的处理程序时,诺言已经实现或被拒绝,则将调用该处理程序,因此在异步操作完成和其处理程序之间没有竞争条件。)
答案 2 :(得分:0)
如果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)
}