zoukankan      html  css  js  c++  java
  • 关于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;
            }
        });
    }

    总结:

      基础还是不扎实呀,加油!

  • 相关阅读:
    .NET面试题系列(五)数据结构(Array、List、Queue、Stack)及线程安全问题
    一个使用 Go 的思维来帮助您构建并开发 Go 应用程序的开源框架
    UML类图学习
    服务器防攻击手段
    .NET面试题系列(四)计算机硬件知识
    .NET面试题系列(三)排序算法
    ASP.NET MVC学习(五)之MVC原理解析
    socketWriter.go
    multiWriter.go
    timeCache.go
  • 原文地址:https://www.cnblogs.com/wxdblog/p/15188330.html
Copyright © 2011-2022 走看看