問題描述:
舊代碼將獲取打印機的操作封裝為一個方法,方法中獲取打印機校驗后再返回打印機信息,執行打開打印機操作。上代碼:
/** * 獲取當前的打印機; */ 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; } }); }
總結:
基礎還是不扎實呀,加油!