条码扫描器Phonegap插件;无法将结果保存到全局变量中,或保存到隐藏字段

时间:2013-08-05 20:12:06

标签: javascript callback cordova phonegap-plugins barcode-scanner

目前我正在开发一个使用条码扫描器插件(v 0.6.0)和phonegap 2.9.0的手机屏幕。实际的条形码扫描仪工作正常,我可以让手机调出相机/扫描仪并读取条形码。我甚至可以将result.text显示在一个简单的警报中(只要我在回调中这样做)。但是,如果我尝试将results.text的值保存到全局变量或隐藏字段中,则该值在变量中未定义,并在字段中为空。

我当前的代码

openBarcodeScanner();
var code = document.getElementById('barcode').value;
alert(code);

function openBarcodeScan(viewInfo){
var scanner = cordova.require("cordova/plugin/BarcodeScanner");
scanner.scan(function (result){
    document.getElementById('barcode').value = result.text;
    },
    function (error){
        alert ( error );
    });
}

我可能会做一些愚蠢的事情,但是对于我的生活来说无法理解。我更喜欢使用全局变量,但隐藏字段是在调用之外传递result.text的最后努力。

编辑:我猜这是因为异步回调,但我不确定如何在函数外部获取result.text。

2 个答案:

答案 0 :(得分:4)

.scan()方法是异步的(它通常表示当方法接受回调而不是返回值时它是异步的)。因此,您提供给.scan()的第一个函数将不会立即执行,因此它不会在您期望的时间设置该值,也不会被您执行的外部代码检索alert(code);

由于您只需要发出一个AJAX请求,因此您可以将请求放在scan回调中,例如:

scanner.scan(function (result) {
    // Make AJAX request, using `result`
}, function (error) {
    alert(error);
});

您也可以进行设置,以便openBarcodeScan函数接受回调,并在扫描成功时运行该回调,例如:

function openBarcodeScan(viewInfo, callback) {
    var scanner = cordova.require("cordova/plugin/BarcodeScanner");
    scanner.scan(function (result) {
        callback(result);
    }, function (error) {
        alert(error);
    });
}

并称之为:

openBarcodeScan("whatever", function (barcode) {
    // Make AJAX request, using `barcode`
});

从技术上讲,您的功能可以简化为:

function openBarcodeScan(viewInfo, callback) {
    var scanner = cordova.require("cordova/plugin/BarcodeScanner");
    scanner.scan(callback, function (error) {
        alert(error);
    });
}

答案 1 :(得分:1)

您需要将回调函数传递给.scan(),以便在扫描意图完成后调用它们。你想要这样的东西:

scanner.scan(success,error);

function success(result) {
  document.getElementById('barcode').value = result.text;
}

function error(error) {
  alert(error);
}