关于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; } }); }
总结:
基础还是不扎实呀,加油!