異步編程的優勢小弟就再也不這裏給你們贅述,相信你們都很熟悉;可是目前小弟遇到了一件很是棘手的問題,正是異步編程給小弟帶來的困擾,廢話很少說,先貼代碼。。。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 不許。。求大神該覺小弟的代碼。。。編程