while循环

时间:2015-12-29 17:46:44

标签: javascript jquery callback getjson asynccallback

嗨我有一个问题,我写了一个小条形码扫描仪

该应用程序的工作方式如下。

  1. 首先我通过getJSON ordercount
  2. 获取所有订单的订单数量
  3. 然后,如果条形码存在与否,我会查看每个订单
  4. 如果条形码存在,我运行另一个函数并将其放入数据库。if(myshopdata.order.reference==barcode)
  5. 现在我想运行函数no_code()如果没有来自while循环的代码匹配,并且 geJSON已完成在函数get_shop_data

    每次我使用该函数时,我都会在getJson完成之前收到错误消息。但是如果没有代码匹配,我只想要错误消息。

    任何人都可以帮我处理我的代码,我可以在我的案例中做到这一点吗?

    在我的程序中,我使用get_order_count(barcode);

    调用第一个函数
    function get_order_count(barcode) {
      //Get numbers of Orders
      $.getJSON("http://www.testurl.de/api/orders/?ws_key=TEEUQWTTU1J76LFQE&output_format=JSON", function(data) {
        // JSON Stringify;                          
        var order = JSON.stringify(data);
        var orderdata = JSON.parse(order);
        var ordercount = Object.keys(orderdata.orders).length
        get_shop_data(ordercount, barcode);
      }); //end of get json    
    } //end of function
    
    function get_shop_data(ordercount, barcode) {
      var orders = ordercount;
      var i = 1;
      while (i <= orders) {
        //Get Order Data
        $.getJSON("http://www.testurl.de/api/orders/" + i + "?ws_key=TEEUQWTTUJ76LFQE&output_format=JSON", function(data) {
          // JSON Stringify;
          var shopdata = JSON.stringify(data);
          //JSON PHARSE into Object                  
          var myshopdata = JSON.parse(shopdata);
          if (myshopdata.order.reference == barcode) {
            addcode(
              myshopdata.order.reference,
              myshopdata.order.associations.order_rows[0].product_name,
              myshopdata.order.total_paid_tax_incl,
              myshopdata.order.associations.order_rows[0].product_id
            );
            //vibrate if valid   
            navigator.notification.vibrate(4000);
          }
        }); //end of get json
        i++
      } //end of while
      no_code();
    } //end of function
    
    function no_code() {
      sweetAlert("code invalid", "Sorry", "error");
    }
    

1 个答案:

答案 0 :(得分:0)

您遇到的问题是您正在编写同步代码,但该解决方案需要异步思考。

纯粹的Javascript。

以下是您遇到的问题的示例。在从您的请求收到任何数据之前执行no_code

&#13;
&#13;
function display(id, text) {
  document.getElementById(id).appendChild(document.createTextNode(text + '\n'));
}

function reply(fn, data) {
  setTimeout(function() {
    fn(data);
  }, 2000);
}

function getJSON(url, fn) {
  if (url === 'orders') {
    reply(fn, {
      orders: [1, 2]
    });
  } else if (url === 'order1') {
    reply(fn, {
      order: {
        reference: 123
      }
    });
  } else if (url === 'order2') {
    reply(fn, {
      order: {
        reference: 789
      }
    });
  }
}

function no_code() {
  alert("error");
}

function get_shop_data(ordercount, barcode) {
  var i = 1;
  while (i <= ordercount) {
    getJSON("order" + i, function(data) {
      display('got', JSON.stringify(data));
      if (data.order.reference === barcode) {
        display('match', JSON.stringify(data));
      }
    });
    i += 1;
  }
  no_code();
}

function get_order_count(barcode) {
  getJSON("orders", function(data) {
    var ordercount = Object.keys(data.orders).length;
    get_shop_data(ordercount, barcode);
  });
}

get_order_count(789);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.4.1/es5-shim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/json3/3.3.2/json3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.34.0/es6-shim.js"></script>

<fieldset>
  <legend>Received</legend>
  <pre id="got"></pre>
</fieldset>
<fieldset>
  <legend>Matched</legend>
  <pre id="match"></pre>
</fieldset>
&#13;
&#13;
&#13;

在您收到getJSON来电的回复之前,系统会收到错误警告。根据我的评论,解决方案是使用Promise

这是相同的代码,但现在使用promises。

&#13;
&#13;
function display(id, text) {
  document.getElementById(id).appendChild(document.createTextNode(text + '\n'));
}

function reply(fn, data) {
  setTimeout(function() {
    fn(data);
  }, 2000);
}

function getJSON(url, fn) {
  if (url === 'orders') {
    reply(fn, {
      orders: [1, 2]
    });
  } else if (url === 'order1') {
    reply(fn, {
      order: {
        reference: 123
      }
    });
  } else if (url === 'order2') {
    reply(fn, {
      order: {
        reference: 789
      }
    });
  }
}

function no_code() {
  alert("error");
}

function get_shop_data(ordercount, barcode) {
  var requests = []
  var i = 1;
  while (i <= ordercount) {
    var p = new Promise(function(resolve, reject) {
      getJSON("order" + i, function(data) {
        display('got', JSON.stringify(data));
        if (data.order.reference === barcode) {
          display('match', JSON.stringify(data));
        }
        resolve('success');
      });
    });
    requests.push(p);
    i += 1;
  }
  Promise.all(requests).then(no_code);
}

function get_order_count(barcode) {
  getJSON("orders", function(data) {
    var ordercount = Object.keys(data.orders).length;
    get_shop_data(ordercount, barcode);
  });
}

get_order_count(789);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.4.1/es5-shim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/json3/3.3.2/json3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.34.0/es6-shim.js"></script>

<fieldset>
  <legend>Received</legend>
  <pre id="got"></pre>
</fieldset>
<fieldset>
  <legend>Matched</legend>
  <pre id="match"></pre>
</fieldset>
&#13;
&#13;
&#13;

现在no_code在请求解决后执行。

你想使用jQuery,所以你需要阅读他们的文档并使用他们的API,但原理是一样的。