正确发送后如何重置 JSON?

Posted

技术标签:

【中文标题】正确发送后如何重置 JSON?【英文标题】:How to reset JSON after send correctly? 【发布时间】:2019-09-14 16:35:59 【问题描述】:

我正在尝试建立一个基本的单页网上商店(产品图片,onclick = "addtocart()" 和一个“购买”按钮onclick="buyprem()"。 购买时,JSON 通过 Websocket 发送到我的 Java 应用程序。 购买后,我想重置代表订单的JSON。但是每当我这样做时,都会发送默认的JSON

json = 
    products: [],
    composite: false,
    premium: false,

i = 0;

function addtocart(name) 
    setTimeout(function() 
        var elem = document.getElementById(name);
        elem.innerhtml = "";

    , 2000);
    document.getElementById(name).innerHTML = i;

    json.products[i] = name;
    i = i + 1;


function buyprem() 
    json.premium = true;
    var websocket = new WebSocket("ws://localhost:4444");
    console.log(JSON.stringify(json))
    websocket.onopen = () => 
            websocket.send(JSON.stringify(json));
        
        //--------------------------
    json = 
        products: [],
        composite: false,
        premium: false,
    
    i = 0;
    //--------------------------
    websocket.close;

当我注释掉标记的部分时,一切正常,Java 得到正确的JSON。 但是当我以这种方式重置json 变量时,Java 得到:

Message from client: "products":[],"composite":false,"premium":false

(标记代码注释掉:

Message from client: "products":["dog","donatello","twitch"],"composite":false,"premium":true

其中 dog、donatello 和 twitch 是产品的名称)

【问题讨论】:

你的函数 buyprem() 使用 assync 命令,这就是原因。 【参考方案1】:

更好的做法:

function buyprem()

  json.premium = true

  let StrJSON  = JSON.stringify(json)

  json.products.length = 0
  json.composite       = false
  json.premium         = false
  i                    = 0

  var websocket = new WebSocket("ws://localhost:4444");
  console.log(StrJSON)
  websocket.onopen = () =>
    
    websocket.send(StrJSON);
    

  //--------------------------
  websocket.close();

因为

json = 
  products: [],
  composite: false,
  premium: false,
  
i = 0;

json使用new内存(在JS中,json是一个指针)

【讨论】:

以上是关于正确发送后如何重置 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

如何重置 react-redux 的值?

单击发送消息后如何重置输入字段

如何在 ajax 回调中重置表单?

如何在 Laravel 5.2 中手动发送密码重置请求?

实现一个python RTMP服务器,flash播放器发送媒体数据后重置连接,如何排除故障

应用查询后重置OnDemandGrid dGrid