异步编程的优势小弟就再也不这里给你们赘述,相信你们都很熟悉;可是目前小弟遇到了一件很是棘手的问题,正是异步编程给小弟带来的困扰,废话很少说,先贴代码。。。css
ps:小弟也是一个代码杀手不少东西不太熟,这是一个纯js项目,项目对小弟js、jquery做了一回恶补啊。。。。 jquery
/* * 修更名称 */ function changeItemName() { var waitChange = $("li:visible:has(:checkbox[name=itemCheck]:checked)", _itemContentList).toArray(); //加载遮罩层 var task = new Task(null, 1, "修改中"); if (waitChange.length > 0) { var changeWay = $("#item_nameAddWay").val(); var addStr = $("#item_nameStr").val() || ""; var replaceStr = $("#item_nameAddStr").val() || ""; //判断是否输入调整的内容 if (changeWay != "productName" && addStr == "") { task.done(); alert("您尚未输入须要调整的内容!"); return; } var numIids = ""; $.each(waitChange, function(i, li) { var name = $("[name=item_title]", li).text(); if (changeWay == "replace") { $("[name=item_hiddenTitle]", li).text(name.replace(addStr, replaceStr)); } else if (changeWay == "delete") { $("[name=item_hiddenTitle]", li).text(name.replace(addStr, "")); } else if (changeWay == "addpre") { $("[name=item_hiddenTitle]", li).text(addStr + name); } else if (changeWay == "addend") { $("[name=item_hiddenTitle]", li).text(name + addStr); } else { numIids += "," + $(":checkbox", li).val(); } }); var success = 0, failed = 0; //调用taobao.fenxiao.distributor.products.get,只能查询到分销商品 if (changeWay == "productName") { getProductName(numIids, function() { chanegeName(waitChange.shift()); }); } else { chanegeName(waitChange.shift()); } //修更名称 function chanegeName(li) { $(li).css("background-color", "white").attr("onclick", null); var newName = $("[name=item_hiddenTitle]", li).text(); if ($("[name=item_title]", li).text() == newName) { success++; } else if (getLengthInBytes(newName) > 60) { failed++; $(li).css("background-color", "pink").attr("onclick", "alert('超过淘宝名称长度限制!')"); } else { update(function() { alert(success); }); } if (waitChange.length > 0) { chanegeName(waitChange.shift()); } else { task.done(); if (failed > 0) { alert("成功:" + success + ";失败:" + failed + "(请点击红色行,查看失败缘由!)"); } else { alert("恭喜您,商品已所有更名成功!"); } } //这是淘宝的一个异步调用函数 function update(callback) { var taobaoInvoke = system.api({ "method": "taobao.item.update", "num_iid": $(":checkbox", li).val(), "title": newName }); taobaoInvoke(function(data) { try { if (data.error_response) { failed++; $(li).css("background-color", "pink").attr("onclick", "alert('" + getErrorMsg(data.error_response) + "')"); sendError("taobao.item.update :chanegeName(li) Error:" + getErrorMsg(data.error_response)); } else if (data.item_update_response.item.modified != "") { success++; $("[name=item_title]", li).text(newName); } else { failed++; $(li).css("background-color", "pink").attr("onclick", "alert('" + JSON.stringify(data) + "')"); } } catch (e) { failed++; $(li).css("background-color", "pink").attr("onclick", "alert('很是抱歉,系统遇到错误,请提醒咱们处理!')"); sendError("taobao.item.update :chanegeName(li) Exception:" + e); } finally { callback(); } }); } } } else { task.done(); alert("您尚未选择须要更名的商品!"); return; } } //调用接口查询名称 function getProductName(numIids, callback) { var taobaoInvoke = system.api({ "method": "taobao.fenxiao.distributor.products.get", "fields": "name,query_item_id", "item_ids": numIids }); taobaoInvoke(function(data) { try { if (data.error_response) { alert("获取产品标题出错:" + getErrorMsg(data.error_response)); sendError("taobao.fenxiao.distributor.products.get :getProductName(numIids) error:" + getErrorMsg(data.error_response)); } else if (data.fenxiao_distributor_products_get_response.products) { var products = data.fenxiao_distributor_products_get_response.products.fenxiao_product; if (products == "undefind") { task.done(); alert("恭喜您,商品已所有更名成功!"); return; } else { $.each(products, function(i, product) { var li = $("li:visible:has(:checkbox[name=itemCheck][value=" + product.query_item_id + "])", _itemContentList); $("[name=item_hiddenTitle]", li).text(product.name); }); callback(); } } else { alert("查询产品名称出错!"); } } catch (e) { task.done(); alert("很是抱歉,系统遇到错误,请提醒咱们处理!"); sendError("taobao.fenxiao.distributor.products.get :getProductName(numIids) Exception:" + e); } }); } 简化下就是***************************************************** function changeItemsName(){ var success, failed = 0; var waitChangeLi = {.......}; function changeName(li){ if (判断) { success++; } else if (判断2) { failed++; } else { //一步执行的函数 taobaoInvoke(function(){ if (判断3) { success; } else { failed++; } }); } if (waitChangeLi.length > 0){ changeName(waitChangeLi.shift()); } else { alert("success:" + success +" failed:" + failed); } } }
这上面的代码 这段代码的问题产生于 异步函数为淘宝提供,小弟只有调用的份(大神的世界小弟不敢动。。。。),如今小弟想在递归 changName函数执行完成后 执行alert(success,failed)。but 异步的可恶形成了小弟的alert 不许。。求大神该觉小弟的代码。。。编程