1. ホーム
  2. jquery

[解決済み] 変数が定義されていない間 - 待つ

2023-04-09 06:24:14

質問

私は click イベントがありますが、これは別の場所から初めて自動的にトリガーされます。問題は、必要な変数がまだFlashとWebサービスによって定義されているため、実行が早すぎることです。だから今、私は持っています。

(function ($) {
    $(window).load(function(){
        setTimeout(function(){
            $('a.play').trigger("click");
        }, 5000);
    });
})(jQuery);

問題は、遅いインターネット接続の人にとっての5秒は速すぎる可能性があり、逆に速いインターネット接続の人にとっては遅すぎるということです。

というわけで、以下のような遅延やタイムアウトをどのように行うべきでしょうか? someVariable が定義されるまでの遅延やタイムアウトはどうすればいいのでしょうか?

どのように解決するのですか?

async, await の実装、改善 トプラックの回答

(async() => {
    console.log("waiting for variable");
    while(!window.hasOwnProperty("myVar")) // define the condition as you like
        await new Promise(resolve => setTimeout(resolve, 1000));
    console.log("variable is defined");
})();
console.log("above code doesn't block main function stack");


OPの質問を再検討した結果。意図されたものを実装するためのより良い方法が実はあります: " 変数セットコールバック というものです。以下のコードは、必要な変数がオブジェクト (またはウィンドウ) によってカプセル化されている場合にのみ動作しますが let または var (最初の答えは、私が実際に元の質問を読まずに既存の答えの改良をやっていただけなので残しました)。

let obj = encapsulatedObject || window;
Object.defineProperty(obj, "myVar", {
    configurable: true,
    set(v){
        Object.defineProperty(obj, "myVar", {
            configurable: true, enumerable: true, writable: true, value: v });
        console.log("window.myVar is defined");
    }
});
    

見る Object.definePropertyを参照してください。 または es6 プロキシ を使うか (これはおそらく過剰な要求です)


もっと探しているのであれば

/**
 * combining the two as suggested by @Emmanuel Mahuni,
 * and showing an alternative to handle defineProperty setter and getter
 */


let obj = {} || window;
(async() => {
  let _foo = await new Promise(res => {
    Object.defineProperty(obj, "foo", { set: res });
  });
  console.log("obj.foo is defined with value:", _foo);
})();
/*
IMPORTANT: note that obj.foo is still undefined
the reason is out of scope of this question/answer
take a research of Object.defineProperty to see more
*/

// TEST CODE

console.log("test start");
setTimeout(async () => {
  console.log("about to assign obj.foo");
  obj.foo = "Hello World!";
  // try uncomment the following line and compare the output
  // await new Promise(res => setTimeout(res));
  console.log("finished assigning obj.foo");
  console.log("value of obj.foo:", obj.foo); // undefined
  // console: obj.foo is defined with value: Hello World!
}, 2000);