关于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;
        }
    });
}

总结:

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

posted @ 2021-08-26 10:26  vlson  阅读(668)  评论(0编辑  收藏  举报