如何在我用作参数的函数中在Javascript中设置局部变量?

时间:2012-08-25 10:50:56

标签: javascript cordova barcode-scanner

我在Android应用程序中使用Barcodescannerplugin for Phonegap在Javascript中遇到了问题。

我使用的插件带来了一个小的Javascript,可以在我的Phongap应用程序中使用Barcodescanner。但在我看来,提供的javascript函数的界面并不是最优的,因为我不想在我使用这些方法的每个位置都进行错误处理。

这就是为什么我试图让界面变得更简单,我只需要调用方法scanBarcode()并且调用脚本从扫描中获取文本或者什么都没有,如果某些内容失败。这是代码:

function scanBarcode(){
    var resultText = '';
    window.plugins.barcodeScanner.scan( 
        function(result) {
            if (!result.cancelled){
                resultText = result.text;
            }
        },
        function(error) {
            alert("Scanning failed: " + error);
        }
    );
    return resultText;
}

我使用的插件可以在Github Phonegap Plugins Android/BarcodeScanner

找到

我的方法的结果总是相同的,一个空字符串。 我认为原因是变量范围,但我不确定如何解决问题。

2 个答案:

答案 0 :(得分:3)

原因是因为window.plugins.barcodeScanner.scan方法异步执行 - 在方法返回之前不会调用成功回调。

我建议从你的方法返回一个Promise对象,所以像(以jQuery为例):

var result = $.Deferred();
window.plugins.barcodeScanner.scan( 
    function(result) {
        if (!result.cancelled){
            result.resolve(result.text);
        }
    },
    function(error) {
        result.reject(error);
    }
);

return result;

答案 1 :(得分:1)

感谢您的帮助,现在有效:)

对于其他所有遇到这些问题的人来说,分辨率看起来像这样:

function scanBarcode(){
    var resultObject = $.Deferred();
    window.plugins.barcodeScanner.scan(
        function(result) {
            if (!result.cancelled){
                resultObject.resolve(result.text);
            } else {
                resultObject.resolve('');
            }
        },
        function(error) {
            resultObject.resolve('');
        }
    );
    return resultObject;
}

现在只需说出以下内容即可轻松获得扫描值:

function clickScanBarcode(){
    var result = scanBarcode();
    result.done( function(text){
        alert('Barcodetext:'+text);
    });
}

我已经更改了错误代码并取消了方式,我总是得到一个空字符串来处理。在我的情况下,更多的错误处理是没用的。

问候, 马库斯