1. ホーム
  2. ジャバスクリプト

[解決済み】非同期のJavascript関数を同期で呼び出す

2022-04-19 22:01:49

質問

まず、これは非常に特殊なケースで、何千行にも及ぶ非常に同期的なコードベースに非同期的な呼び出しを後付けするために、意図的に間違った方法をとっているものです。でも、現実と理想がかみ合わないことはよくあることです。

さて、それはさておき、どうすればできるようになるのでしょう。

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);