【问题标题】:How to save JSON returned in a javascript function as a variable?如何将javascript函数中返回的JSON保存为变量?
【发布时间】:2017-09-03 12:43:17
【问题描述】:

在从 api.ipify.org 以 JSON 格式检索客户端 IP 地址后,我尝试将其保存在变量中。如果我提醒结果,我可以让 IP 显示,但由于某种原因无法将其保存在变量中。

这行得通:

<script>

function getIP(json) {
    alert(json.ip);
}

</script>
<script src="https://api.ipify.org?format=jsonp&callback=getIP"></script>

但这不起作用:

<script>

var clientIP = ''

function getIP(json) {
    clientIP = json.ip;
    return clientIP;
}

alert(clientIP);

</script>
<script src="https://api.ipify.org?format=jsonp&callback=getIP"></script>

我希望能够将数据存储在一个变量中,以便我可以将它附加到一个嵌入中,从而将它添加到其自动 webhook POST 中。

<!-- begin video recorder code --><script type="text/javascript">
var IPADDRESSVARIABLE = 'SOME_IP_ADDRESS'
var size = {width:400,height:330};
var flashvars = {qualityurl: "avq/300p.xml",accountHash:"BUNCHOFRANDOMSTUFF", eid:2, showMenu:"true", mrt:120,sis:0,asv:1,mv:0, payload: IPADDRESSVARIABLE};
(function() {var pipe = document.createElement('script'); pipe.type = 'text/javascript'; pipe.async = true;pipe.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 's1.addpipe.com/1.3/pipe.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(pipe, s);})();
</script>
<div id="hdfvr-content"> </div>
<!-- end video recorder code -->

如果我可以将 IP 地址保存为全局变量,那么我可以将其传递到“flash vars”的“payload”键中。

【问题讨论】:

    标签: javascript json function variables ip-address


    【解决方案1】:

    第二个代码示例不起作用,因为该变量仅在回调函数内部被赋予了一个值,这意味着警报同步运行,只要 javascript 解释器开始逐行读取和运行代码,就会运行,但是 getIP 函数仅在 jsonp 请求返回响应时才被调用。您的第一个代码示例是正确的方法。

    【讨论】:

    • 我只是使用 alert() 来尝试验证我想要的数据是否存储到变量中。我还能如何将该函数的结果存储到全局变量中?
    • 如果您正在等待调用外部脚本的结果,您需要异步执行操作,以便外部调用首先返回,这就是您将 getIP 函数注册为回调的原因我想的第一个地方。在这种情况下,您必须确保其余代码处于等待状态。
    【解决方案2】:

    您的alert 将不起作用,因为您的代码没有同步执行,getIP 直到您的alert 语句之后才会被调用。您需要在 getIP 函数中触发任何依赖于 clientIP 的功能。这是一个例子:

    function getIP(json) {
       var event = new CustomEvent('iploaded', { detail: json.ip });
       document.dispatchEvent(event);
    }
    
    document.addEventListener('iploaded', function(event) {
       var IPADDRESSVARIABLE = event.detail;
       var size = {width:400,height:330};
       var flashvars = {qualityurl: "avq/300p.xml",accountHash:"BUNCHOFRANDOMSTUFF", eid:2, showMenu:"true", mrt:120,sis:0,asv:1,mv:0, payload: IPADDRESSVARIABLE};
       (function() {var pipe = document.createElement('script'); pipe.type = 'text/javascript'; pipe.async = true;pipe.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 's1.addpipe.com/1.3/pipe.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(pipe, s);})();
    });
    
    // simulate jsonp callback
    getIP({ ip: '127.0.0.1' });

    另外,在getIP 中不需要return

    【讨论】:

    • 所以我实际上并没有尝试提醒 IP 地址。这只是我试图弄清楚如何将 ip 本身存储到一个变量中,以便我可以将它发送到一些 flash 变量中,强制它通过第三方 webhook 发送到我的 php 处理程序。所以我的最终目标是将 ip 放入一个全局变量中。
    • 不错的答案,尽管他需要将任何依赖于 clientIP 的代码放在 getIP 函数中并不是严格意义上的。他可以将 clientIP 传递给可能在不同文件中的 webworker,或者触发自定义事件(将 clientIp 与它一起传递)。
    • 你不能在 PHP 中使用 $_SERVER['REMOTE_ADDR'] 吗?
    • @RobM。对不起,如果我理解不正确,那么我会通过 getIP();嵌入代码flahsvars?
    • 另外,我使用 $_SERVER['REMOTE_ADDR'] 的问题是,由于有数百人录制视频,我没有足够的创造力在我的 PHP 处理程序中捕获他们的 IP,然后将其与正确的视频信息。视频信息来自 A-->B-->phphandler 如果我要从 A-->phphandler 获取 ip 我不确定是否能够配对另一侧的信息。
    【解决方案3】:

    试试这个:

    function getIP(json) {
        return json.ip;
    }
    
    var json = { "ip": "111.22.33.44"}
    var clientIP = getIP(json);
    
    alert(clientIP);

    【讨论】:

    • 我需要能够避免对 IP 地址进行硬编码,因为当数百人访问我的应用时,我需要它在后台发生。
    • @ChaceMcguyer 我在答案中硬编码,因为它只是一个演示。显然它将是动态的。
    【解决方案4】:

    我找到了解决方法!我将 IP 函数的结果存储到一个隐藏的 div 中以充当容器。然后我在嵌入代码中声明了一个变量并将其设置为 innerHMTL。它可能不是最优雅的,但它完全符合我的要求!

    //hidden container to store the client IP address
    <div id = 'ipContainer' style='display:none'></div>
    
    //function to retrieve the client IP address
    <script>
    function getIP(json) {
        document.getElementById('ipContainer').innerHTML = json.ip;
    }
    </script>
    
    //shortened version of the URL that returns the IP
    <script src='http://www.api.ipify.org'><script>
    
    
    //embed code for the video recorder
    <script>
    <!-- begin video recorder code --><script type="text/javascript">
    var clientIP = document.getElementById('ipContainer').innerHTML;
    var size = {width:400,height:330};
    
    
    //I passed the clientIP variable into the payload element of the flashvars object
    var flashvars = {qualityurl: "avq/300p.xml",accountHash:"RANDOM ACCOUNT HASH", eid:2, showMenu:"true", mrt:120,sis:0,asv:1,mv:0, payload:clientIP}; //Here i passed the clientIP which is nor stored as a variable
    (function() {var pipe = document.createElement('script'); pipe.type = 'text/javascript'; pipe.async = true;pipe.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 's1.addpipe.com/1.3/pipe.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(pipe, s);})();
    </script>
    <div id="hdfvr-content"> </div>
    <!-- end video recorder code -->
    

    【讨论】:

      【解决方案5】:

      正如 Rob 所说,您希望代码同步运行,但事实并非如此。

      这是你的代码 sn-p 的一个小编辑,它可以工作,基本上我已经将警报包装在一个函数中,然后在 getIP 函数完成执行后调用该函数。

      <script>
      
      var clientIP = ''
      
      function getIP(json) {
          clientIP = json.ip;
          alertClientIp();
      }
      
      function alertClientIp () {
          alert(clientIP);
      }
      
      </script>
      

      上面sn-p的代码设计有点恶心,如果你只需要使用一次客户端IP,那就别费心把它存储为变量,直接传给执行你“自动”的函数即可webhook POST”逻辑。

      <script>
      
          function getIP(json) {
              clientIP = json.ip;
              alertClientIp();
          }
      
          //Accept the client_ip as a param
          function webhookLogic (client_ip) {
      
             //Execute your logic with the client_ip, 
             //for simplicity I'll stick to your alert.
      
             alert(client_ip);
          }
      
          </script>
      

      关于您的修改

      看起来您将两组逻辑放在两个单独的脚本元素中,您不能将它们合并为一个吗?

      <script>
      
          function getIP(json) {
              clientIP = json.ip;
              alertClientIp();
          }
      
          //Accept the client_ip as a param
          function webhookLogic (client_ip) {
      
             //Execute your logic with the client_ip, 
             //for simplicity i'll stick to your alert.
      
             //Trigger your video wrapper code, unsure if 
             //if this method of execution will break your app...
             videoWrapper(client_ip);
          }
      
           //Your video code from your latest edit
          function videoWrapper (client_ip) {
              var IPADDRESSVARIABLE = client_ip;
              var size = {width:400,height:330};
              var flashvars = {qualityurl: "avq/300p.xml",accountHash:"BUNCHOFRANDOMSTUFF", eid:2, showMenu:"true", mrt:120,sis:0,asv:1,mv:0, payload: IPADDRESSVARIABLE};
          (function() {var pipe = document.createElement('script'); pipe.type = 'text/javascript'; pipe.async = true;pipe.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 's1.addpipe.com/1.3/pipe.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(pipe, s);})();
         }
          </script>
      

      如果该执行链破坏了您的应用程序,那么我认为您需要重新考虑问题的构成,很清楚您想要做什么,但您的问题缺少一些元数据,因为这个逻辑如何“组合在一起”。

      【讨论】:

      • 所以 webhook 是通过第三方在录制网络摄像头视频时发送 JSON 的有效负载。我可以通过将变量或字符串添加到嵌入代码中的闪存变量,将自定义数据从他们的服务器添加到有效负载。我将更新我的原始问题,以便您查看。
      • 是的,我会将它们合并为一个,当我的视频上传到它们时,Webhook 逻辑会从 AddPipe 服务器自动执行。我唯一需要的是将function getIP(json) 的结果放入一个全局变量中,以便我可以将它添加到嵌入代码中。这就是我在原始代码中使用 return 的原因。我这边没有任何 webhook 逻辑。
      • 我太习惯python了,它就像myVar = ' ' def myFunction(): myVar = xyz myFunction()一样简单
      猜你喜欢
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 2017-12-02
      • 2013-04-26
      • 2017-12-01
      • 1970-01-01
      相关资源
      最近更新 更多