[解決済み】非同期のJavascript関数を同期で呼び出す
質問
まず、これは非常に特殊なケースで、何千行にも及ぶ非常に同期的なコードベースに非同期的な呼び出しを後付けするために、意図的に間違った方法をとっているものです。でも、現実と理想がかみ合わないことはよくあることです。
さて、それはさておき、どうすればできるようになるのでしょう。
function doSomething() {
var data;
function callBack(d) {
data = d;
}
myAsynchronousCall(param1, callBack);
// block here and return data when the callback is finished
return data;
}
例では、ライブラリやコンパイラを使用していますが、このソリューションではどちらも実行不可能です。UIをフリーズさせずにブロックさせる(例えば、コールバックが呼ばれるまでdoSomething関数を放置しない)方法の具体例が必要です。もしそのようなことがJSで可能であれば。
解決方法は?
<ブロッククオート正しい方法でやればいいとか、そういうことは言わないでください。
OKです。 <サブ が、本当は正しい方法でやるべきだ......とかなんとか
<ブロッククオート" ブロックさせるための具体例が欲しい.UIをフリーズさせることなく。もしそのようなことがJS.".で可能であるなら。
いいえ、UIをブロックすることなく、実行中のJavaScriptをブロックすることは不可能です。
情報が不足しているので、解決策を提示するのは難しいですが、1つの選択肢として、呼び出し側の関数にグローバル変数をチェックするためのポーリングを行わせ、コールバックで
data
をグローバルに設定します。
function doSomething() {
// callback sets the received data to a global var
function callBack(d) {
window.data = d;
}
// start the async
myAsynchronousCall(param1, callBack);
}
// start the function
doSomething();
// make sure the global is clear
window.data = null
// start polling at an interval until the data is found at the global
var intvl = setInterval(function() {
if (window.data) {
clearInterval(intvl);
console.log(data);
}
}, 100);
これらのすべては、あなたが変更できることを前提としています
doSomething()
. そんなのあるのかな?
もし修正できるのであれば、なぜコールバックを
doSomething()
を、もう一方のコールバックから呼び出されるようにしたのですが、面倒なことになる前にやめたほうがよさそうです;)
あ、なんだ、そうなんだ。ちゃんとできそうな例を挙げてくれたので、その解決策を示すと......。
function doSomething( func ) {
function callBack(d) {
func( d );
}
myAsynchronousCall(param1, callBack);
}
doSomething(function(data) {
console.log(data);
});
あなたの例では、非同期呼び出しに渡されるコールバックが含まれているため、正しい方法は、関数を
doSomething()
をコールバックから呼び出すようにします。
もちろん、コールバックが行うことがそれだけであれば、単に
func
を直接指定します。
myAsynchronousCall(param1, func);
関連
-
[解決済み】Failed to load resource: net::ERR_FILE_NOT_FOUND loading json.js
-
[解決済み】TypeError: 'undefined'はオブジェクトではありません。
-
[解決済み】Uncaught TypeError: nullのプロパティ'value'を読み取ることができない
-
[解決済み】TypeError:res.jsonは関数ではありません。
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Facebook Graph API のクエリで with=location を使用すると "Uncaught (in promise) undefined" というエラーが発生する。
-
[解決済み】node.js TypeError: path must be absolute or specify root to res.sendFile [JSONのパースに失敗しました]。
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】JavaScriptのinnerHTMLで要素が更新されない
-
[解決済み】コンソールがUnterminated JSX contentsエラーを投げる【終了しました
-
[解決済み】DOMException: サポートされているソースが見つからなかったため、読み込みに失敗しました。
-
[解決済み】Kendo Observable Bindingと併用する場合、Kendo Switch Labelsを変更することは可能ですか?[Kendo-UI]です。
-
[解決済み】Vueのテンプレートまたはレンダー関数が定義されていない 私はどちらも使っていないのですが?
-
[解決済み】ETIMEDOUTエラーの対処方法は?
-
[解決済み】Vueが定義されていない