2

現在、バーコード スキャナー プラグイン (v 0.6.0) と phonegap 2.9.0 を使用する phonegap に取り組んでいます。実際のバーコード スキャナーは正常に動作し、電話でカメラ/スキャナーを起動してバーコードを読み取ることができます。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を取得する方法がわかりません。

4

2 に答える 2

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);
    });
}
于 2013-08-06T14:21:46.830 に答える
1

コールバック用の関数を .scan() に渡す必要があるため、スキャン インテントの終了後に呼び出すことができます。次のようなものが必要です。

scanner.scan(success,error);

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

function error(error) {
  alert(error);
}
于 2013-08-05T22:03:05.477 に答える