【问题标题】:Returning result from nested anonymous function in a hubot script从hubot脚本中的嵌套匿名函数返回结果
【发布时间】:2015-09-05 17:17:30
【问题描述】:

以前从未使用过 coffescript,我正在尝试更新 hubot script for jenkins integration。简而言之,我想调用 jenkins,从该调用中获取结果并在后续调用中使用它。基于 hubot 脚本中的现有代码,我添加了以下函数:

jenkinsCrumb = (msg) ->
    url = process.env.HUBOT_JENKINS_URL
    path = "#{url}/crumbIssuer/api/json"

    req = msg.http(path)

    if process.env.HUBOT_JENKINS_AUTH
      auth = new Buffer(process.env.HUBOT_JENKINS_AUTH).toString('base64')
      req.headers Authorization: "Basic #{auth}"

    req.get() (err, res, body) ->
        if err
          msg.reply "Jenkins says: #{err}"
        else if 200 <= res.statusCode < 400 # Or, not an error code.
          msg.reply "#{body}"
          body
        else if 404 == res.statusCode
          msg.reply "Unable to fetch crumb from Jenkins..."
        else
          msg.reply "Jenkins says: Status #{res.statusCode} #{body}"

调用这个函数的时候,变量body中报告了我想要的值。对msg.reply 的调用会在hubot 聊天窗口中正确显示该值。

我想做但不知道如何让这个函数返回body 的值?我已经尝试显式返回 req.get() 的值,但它似乎返回了完整的请求对象。

【问题讨论】:

    标签: coffeescript hubot


    【解决方案1】:

    您可以通过在匿名函数的末尾添加 return body 或只是 body(因为 CoffeeScript)来做到这一点:

    jenkinsCrumb = (msg, callback) ->
        url = process.env.HUBOT_JENKINS_URL
        path = "#{url}/crumbIssuer/api/json"
    
        req = msg.http(path)
    
        if process.env.HUBOT_JENKINS_AUTH
          auth = new Buffer(process.env.HUBOT_JENKINS_AUTH).toString('base64')
          req.headers Authorization: "Basic #{auth}"
    
        req.get() (err, res, body) ->
            if err
              msg.reply "Jenkins says: #{err}"
            else if 200 <= res.statusCode < 400 # Or, not an error code.
              msg.reply "#{body}"
              body
            else if 404 == res.statusCode
              msg.reply "Unable to fetch crumb from Jenkins..."
            else
              msg.reply "Jenkins says: Status #{res.statusCode} #{body}"
    
            # critical part
            callback(body)
    

    【讨论】:

    • 值得指出他缺少的东西:Coffee 默认返回块中的最后一个值。所以在他的第一种情况下,它返回了req.get 函数(我认为)。
    • @jcollum - 这似乎正是正在发生的事情。我尝试了@ccg 的建议,但我仍然得到的显然是从req.get() 而不是body 返回的JSON 块。那么如何返回 body 中的内容而不是 req.get() 返回的内容?
    • 如果jenkinsCrumb 需要返回body,它将需要接收一个回调并将body 返回到该回调(如done(body));因为@ccg 已经完成了 95% 的工作,所以我会要求他修改他的代码来完成这项工作
    • @jcollum 我已经修改了代码以包含回调。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 2021-09-06
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多