2016-04-13 20 views
0

私はラベルを印刷するためにqz print Apiを使用しています。アラートにデフォルトプリンタを表示する独自の関数(JS)を持っています。私はdivにプリンタ名を表示したい。私は今まで達成しています。私のコードは以下の通りです。JS関数が正しく値を返さない

function useDefaultPrinter() { 
var printer; 
if (isLoaded()) { 
// Searches for default printer 
qz.findPrinter(); 
window['qzDoneFinding'] = function() { 
// Alert the printer name to user 
printer = qz.getPrinter(); 

window['qzDoneFinding'] = null; 
defaultFound = true; 
}; 
    } 
alert(printer); 
return(printer); 
} 

HTML

var printer_name = useDefaultPrinter(); 
lbDownHtml += "<div><span>Default printer found: '" + printer_name + "'</span>"; 
lbDownHtml += "</div>"; 

を表示するための問題は私が復帰する前に警告useDefaultPrinterで(プリンタ)を()を使用いけない場合、それは未定義表示しますが、アラートは、上記のコードのように存在する場合、それが表示されるということです私はそれを印刷しているhtmlでアラートだが完璧な出力でundefine。どうした?私は警告したくありません(しかし、私はそれを使用しない場合、それは未定義を示しています)。

+0

"useDefaultPrinter()"に "qz"というプレフィックスを付ける必要はありませんか?アンカー要素を持たないもあります。 –

+0

"useDefaultPrinter()"の前に "qz"を付ける必要はありませんか?私はここで私はここで私は間違って入力したを削除していない –

+0

を試してみてください:var printer_name = qz.useDefaultPrinter(); –

答えて

1

私はこのAPIについてほとんど知りませんが、これは実際には一般的な問題です。

qz.findPrinter()機能は非同期ように見える - あなたのuseDefaultPrinter機能が終了したとき、それはまだ積極的に実行されます。

非同期関数の場合、関数がまだ存在しないため、単に値を返すことはできません。最も一般的な解決策は、関数に "コールバック"引数を追加することです(callbackそれ自体は "関数変数"になります)。次に、必要なオブジェクトが利用可能になったら、そのコールバック関数を呼び出します。あなたのコードでは、これはここで次のようになります。

// Alert the printer name to user 
printer = qz.getPrinter(); 

ができたら、外useDefaultPrinterを必要とするものは何でもコード書き直す必要があるだろう。

前:

printer = useDefaultPrinter(); 
// continue operation here... 

後:あなたはまだ混乱している場合

useDefaultPrinter(function(printer) { 
    //...continue operation here... 
}); 

、 "JavaScriptの非同期プログラミングのチュートリアル" をGoogleで検索。あなたのユーザー名に基づいて、英語は母国語ではない可能性があるので、あなたの学習スタイルに合った説明を見つけることができれば、それに従う方が簡単かもしれません - ほとんどの開発者にとって最初は意味をなさない傾向があります。

+0

私は助けてもらえませんでした。 –

+0

@AmmarUlHassan私の投稿を少し鮮明に編集しようとしました。がんばろう。 – Katana314

関連する問題