ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关于js调用方法后,方法内异步执行影响返回结果问题的处理

2021-08-26 10:34:38  阅读:221  来源: 互联网

标签:异步 打印机 printer name default ip js var 方法


问题描述:

  旧代码将获取打印机的操作封装为一个方法,方法中获取打印机校验后再返回打印机信息,执行打开打印机操作。上代码:

/**
 * 获取当前的打印机;
 */
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;
        }
    });
}

总结:

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

标签:异步,打印机,printer,name,default,ip,js,var,方法
来源: https://www.cnblogs.com/wxdblog/p/15188330.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有