NodeJS承诺:我是否有竞争条件问题?

时间:2019-04-10 03:50:45

标签: javascript node.js

我有一些在事件发生时运行的代码,并调用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上运行很重要,并且两个用户不可能锁定相同的空间

谢谢

3 个答案:

答案 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)
}