【问题标题】:coffeescript with Request scoping带有请求范围的咖啡脚本
【发布时间】:2012-11-17 22:45:14
【问题描述】:
request = require('request')

auth =
url: ''
method: 'POST'
json:
  credentials:
  username: ""
  key: ""

exports = exports ? this

request auth, (err, res, body) ->
  exports.inside = body

console.log(exports.inside)


上面是带有 Node.js 请求模块的 Coffeescript。我无法弄清楚如何获取请求函数中的数据。这一直是我申请的主要障碍。

谢谢!

** 编辑**

Vadim Baryshev 的代码更新做到了!非常感谢你:)!

【问题讨论】:

    标签: node.js coffeescript


    【解决方案1】:

    您试图在request 函数回调中分配之前输出exports.inside。因为request 函数是异步的。您可以通过回调或事件获取此函数的结果。

    更新

    request = require('request')
    
    exports = exports ? this
    
    getAuth = (callback) ->
      auth =
      url: ''
      method: 'POST'
      json:
        credentials:
          username: ""
          key: ""
    
      request auth, (err, res, body) ->
        exports.inside = body
        callback err, body
    
    getAuth (err, body) ->
      # here is exports.inside ready
      console.log exports.inside
      # also you can access body and request error arguments here
      # body === exports.inside here
      # err is request error (is null/undifined if request is successful)
    

    【讨论】:

    • 你有例子吗,这样我可以更好的理解。我对 JS / CS 很陌生。
    • 我仍然在试图用我上面的例子做回调......异步并不容易。任何和所有的帮助都会受到极大的欢迎和欢迎。 :)
    • 我仍在与这个问题作斗争,并试图让 CoffeeScript / Request 回调正常工作。任何和所有的帮助都很棒。 :)
    【解决方案2】:

    一旦请求函数完成,它会触发一个回调,这是唯一可以可靠访问“body”值的地方。

    您遇到的问题是,console.log 函数运行时,由于请求未完成,因此未触发回调。

    请参阅Problems with use fs.stat in nodejs,以获得对异步编程环境中程序流的更中肯的描述。

    ---编辑--- 例如:

    考虑一下:

    1: path='/tmp/file.txt'
    2: result=''
    3: fs.readFile path, (err,data) ->
    4:    throw err if err
    5:    result=data
    6: console.log result
    

    如果我们要跟踪这个操作,我们会发现执行顺序是 1,2,3,6,...4,5 其中,由于磁盘 i/o 的性质,省略号表示一些未知的时间。

    因为读取操作需要一些时间才能完成,而不是等待其结果,所以我们提供了一个回调函数,该回调函数将在未来某个不可预知的时间点被调用,当文件的内容已经被读取时,因此可以分配给“结果”。

    当程序流程到达第6行时,由于文件读取操作尚未完成,因此尚未调用回调,因此尚未设置结果。

    这是异步编程的本质,我们可以将浪费的时间用于其他目的,而不是等待操作完成后再继续。

    ---第二次编辑--- 好的,根据您的要求,这里是您的示例修改,以便它工作。

    request = require('request')
    
    auth =
      url: ''
      method: 'POST'
      json:
        credentials:
        username: ""
        key: ""
    
    exports = exports ? this
    
    request auth, (err, res, body) ->
      exports.inside = body
      console.log(exports.inside)
    

    请注意,正如现在已经多次描述的那样,您无法在回调之外访问请求的结果,因为您无法知道请求何时完成。

    【讨论】:

    • 这确实有道理,但对我来说更加混乱。是时候举出优秀的例子了,让我大吃一惊……
    • 我明白问题出在哪里,但是有没有办法可以用我的例子展示有效的解决方案.....我对此感到茫然。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多