關於js調用方法后,方法內異步執行影響返回結果問題的處理


問題描述:

  舊代碼將獲取打印機的操作封裝為一個方法,方法中獲取打印機校驗后再返回打印機信息,執行打開打印機操作。上代碼:

/**
 * 獲取當前的打印機;
 */
getDefaultdPrinter = function(){
    // 為了避免打印的時候,數據打印不完全的問題,js接口中采用的是ajax同步請求方式;
    // 為了避免服務未打開的時候,調用接口時出現假死狀態,在合適的地方調用皆苦前最好先檢測下url是否可用
   var printer = []; 
    printer = api.checkUrl(function() {
        var printerInfo = api.getPrinters(true, true, true);
        var default_printer = printerInfo ? printerInfo.printers[0] : [];//如果有多個LPAPI打印機,默認使用第一個
        console.log('標簽打印機信息為:');
        console.log(default_printer);
        if(!default_printer.name || !default_printer.ip){
            return {};
        }
        return {
            printerName : default_printer.name,
            ip : default_printer.ip
        }
    });
    return printer; 
}


/**
 * 打開當前打印機;
 */
openPrinter = function() {
    var printer = getDefaultdPrinter();
    if (printer.printerName){
        return api.openPrinter(printer);
    }else{
        return false;
    }
}

  上面代碼的問題是在getDefaultdPrinter 方法中,會出現異步執行,還沒有執行完成api.checkUrl,就會return printer;

 

解決辦法:

  將后續執行已callback方法作為參數形式傳遞進去,執行完api.checkUrl再繼續后面的操作。代碼如下:

/**
 * 獲取當前的打印機;
 */
getDefaultdPrinter = function(callback){
    // 為了避免打印的時候,數據打印不完全的問題,js接口中采用的是ajax同步請求方式;
    // 為了避免服務未打開的時候,調用接口時出現假死狀態,在合適的地方調用皆苦前最好先檢測下url是否可用

    var processRes = false;
    var printer = [];
    api.checkUrl(function() {
        var printerInfo = api.getPrinters(true, true, true);
        var default_printer = printerInfo ? printerInfo.printers[0] : [];//如果有多個LPAPI打印機,默認使用第一個
        console.log(default_printer);
        if(!default_printer.name || !default_printer.ip){
            return {};
        }

        var name = (default_printer.hostname && default_printer.type !== 1) ? default_printer.name + "@" + default_printer.hostname : default_printer.name;
        var ip = default_printer.ip ? default_printer.name + "@" + default_printer.ip : default_printer.name;
        console.log('checkUrl標簽打印機名稱:'+name);
        console.log('checkUrl標簽打印機IP:'+ip);

        callback({
            printerName: name,
            ip: ip
        });
    });

}

/**
 * 打開當前打印機;
 */
openPrinter = function() {
    var printer = getDefaultdPrinter(function(printer){
        console.log('獲取默認打印機后1:');
        console.log(printer);

        if (printer.printerName){
            return api.openPrinter(printer);
        }else{
            return false;
        }
    });
}

總結:

  基礎還是不扎實呀,加油!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM