【问题标题】:Synchronous control flow using coroutine in Javascript在 Javascript 中使用协程的同步控制流
【发布时间】:2014-02-26 11:48:57
【问题描述】:

我想知道我们是否可以实现一个可以在 Javascript 中阻塞的函数。例如:

var username = getUserName(); //wait for user input username in a certain way
doSth(username);

我希望 getUserName 可以阻止,直到用户输入有效的用户名。我想知道我们是否可以使用协程或其他方式来实现这个目标。谢谢。

【问题讨论】:

  • 你可以使用 Javascript prompt() 函数。
  • 您希望用户如何输入?
  • 在某些浏览器中,您可以使用非标准 showModalDialogmodal 输入。不过,我不建议这样做。

标签: javascript coroutine


【解决方案1】:

这里是 CSP 粉丝。我花了半年的时间在 JavaScript 解决方案中的 CSP 上工作,我想我在这个地方。如果您有兴趣,请查看Riew

【讨论】:

    【解决方案2】:

    随着生成器到 javascript 和 Aryn 的帮助,可以在 Node.js 或客户端中使用协程和 CSP(通信顺序进程)。

    Node.js 中的 Aryn + Promise 示例:

    function getUsername(id) {
        return new Promise(function(resolve, reject) {
            db.query('select username from user where id = ?', [id], function(r){
                resolve(r[0].username)
            })
        })
    }
    
    // your coroutine
    aryn.run(function*(){
        var username = yield getUsername(id)
        console.log(username)
    })
    

    使用 Aryns drive 函数:

    db = aryn.drive(require('db'))
    
    var getUsername = aryn.def(function*(){
        return yield aryn.receive(db.query('select username from user where id = ?', [id]))
    })
    
    aryn.run(function*(){
        var username = yield getUsername(id)
        console.log(username)
    })
    

    【讨论】:

      【解决方案3】:

      这不是“阻塞”,但您始终可以使用回调

      function getUsername(done) {
        try {
          var username = // some process that gets the username;
          return done(null, username);
        }
        catch (err) {
          return done(err);
        }
      }
      
      getUsername(function(err, username) {
        if (err) throw err;
        console.log(username);
      }
      

      【讨论】:

        【解决方案4】:

        在浏览器中,最接近协程的是 Ecmascript 6 标准中提出的类似 Python 的generators。但是,截至今天,只有 Firefox 和 NodeJ 的前沿版本原生支持它们。

        鉴于大多数浏览器不支持协程(并且由于 IE 的旧版本在很长一段时间内不会支持),您最好的选择是使用纯 JavaScript 控制流库(参见“async.js”或承诺)或使用一些工具将使用协程扩展的 Javascript 方言编译回连续传递样式。有一些使用 ES6 语法,还有一些使用不同的语法(还有一些非 JS 语言编译成 Javascript)

        最后,为了让事情保持完整,Nodejs 中有一个 Fibers 功能,它有点类似于协程,但它仅限于服务器端,所以我认为它们对你不会很有用。

        【讨论】:

          猜你喜欢
          • 2017-09-18
          • 1970-01-01
          • 2017-03-18
          • 1970-01-01
          • 2015-12-19
          • 1970-01-01
          • 1970-01-01
          • 2020-11-19
          • 1970-01-01
          相关资源
          最近更新 更多