嗨我有一个问题,我写了一个小条形码扫描仪
该应用程序的工作方式如下。
if(myshopdata.order.reference==barcode)
现在我想运行函数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");
}
答案 0 :(得分:0)
您遇到的问题是您正在编写同步代码,但该解决方案需要异步思考。
纯粹的Javascript。
以下是您遇到的问题的示例。在从您的请求收到任何数据之前执行no_code
。
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;
在您收到getJSON
来电的回复之前,系统会收到错误警告。根据我的评论,解决方案是使用Promise
。
这是相同的代码,但现在使用promises。
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;
现在no_code
在请求解决后执行。
你想使用jQuery,所以你需要阅读他们的文档并使用他们的API,但原理是一样的。