Js Deferred/Promise/Future compared to functional languages like Scala

前端 未结 4 847
迷失自我
迷失自我 2020-12-05 03:21

I\'m mostly using programming languages like Scala and JavaScript. I\'m trying to understand the similarities and differences in how async reactive programming is used in bo

4条回答
  •  醉酒成梦
    2020-12-05 03:49

    In contrast to Scala, the JS Promise is not a monad, due to the implicit "thenable" unwrapping breaking monadic law. You can, however, implement a callback-based monadic semantics and functionality, serving the same purpose.

    See e.g. the cpsfy library.

    In addition, there is a structural difference due to .then accepting 2 functions, while .chain accepts only one. However, a chain accepting 2 or even any number of argument functions can be implemented, like e.g. with CPS wrapper from cpsfy:

    //function returning CPS function with 2 callbacks
    const readFileCps = file => (onRes, onErr) =>  
      require('fs').readFile(file, (err, content) => {
        err ? onErr(err) : onRes(content)
      })
    
    // CPS wraps a CPS function to provide the API methods
    const getLines = CPS(readFileCps('name.txt'))
      // map applies function to the file content
      .map(file => file.trim()) 
      .filter(file => file.length > 0)
      // chain applies function that returns CPS function
      .chain(file => readFileCps(file))
      .map(text => text.split('\n'))
    // => CPS function with 2 callbacks
    
    // To use, simply pass callbacks in the same order
    getLines(
      lines => console.log(lines),  // onRes callback
      err => console.error(err)  // onErr callback
    )
    

提交回复
热议问题