一個一步操做的困擾 javascript

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

相關文章
相關標籤/搜索