console.logをオーバーライドするときに、promiseオブジェクトの状態と値をどのように表示しますか

アトム33ls

console.log出力をdivに表示しようとしていますconsole.log関数をオーバーライドしてこれを行っています

オリジナルを使用するconsole.logと、コンソールにpromiseが次のように表示されます(以下のコードの1.を参照)。

Promise { <state>: "fulfilled", <value>: undefined }

私がそれをオーバーライドすると、divで取得します::

 [object Promise]

(以下のコードの2を参照)

次のコードをどのように調整して、<state>プロパティを「main」divに表示しますか?

const pause =  sec => new Promise(r => setTimeout(r, 1000 * sec))

// 1. Original console.log
;(async function(){
  await new Promise(resolve => document.addEventListener('DOMContentLoaded', resolve));
  let x = pause(0.5)
  console.log(x)
  await x;
  console.log(x)
})();

// 2. Overridden console.log
;(async function(){
  await new Promise(resolve => document.addEventListener('DOMContentLoaded', resolve));
  await pause(1)
  let divconsole = document.getElementById('main');
  // Override console.log:
  console.log = function () {
    for (let i = 0; i < arguments.length; i++) {
      if (typeof arguments[i] === 'object') {
          divconsole.innerHTML += 'console.log arg ' + String(i) + ':  ' + String(arguments[i]) + '<br>';
      }
    }
  }

  let y = pause(0.5)
  console.log(y)
  await y;
  console.log(y)
})();
<div id="main" style="width:100%;height:auto;background-color:lightblue;">

</div>

私が尋ねている理由についてのメモ:私は、モバイルブラウザではなくデスクトップブラウザで解決する約束のあるコードを持っています。私はこれをデバッグしようとしています(一貫したモバイルデスクトップOSエコシステムなしで)。簡単な例で再現できれば、フォローアップの質問を書くかもしれません。

イブラヒムマハリール

この他のSO回答からこのトリックを使用して、そのPromiseようなタイプの引数を処理できますこのトリックでは、カスタムconsole.logを次のように非同期にする必要があります

function promiseState(p) {
    const t = {};
    return Promise.race([p, t])
      .then(v =>
        (v === t)? { state: "pending" } : { state: "fulfilled", value: v },
        () => { state: "rejected" }
      );
}

console.log = async function(...args) {
  for (let arg of args) {
    if (arg instanceof Promise) {
      let state = await promiseState(arg);
      divconsole.innerHTML += `Promise { &lt;state&gt;: "${ state.state }"${ state.state === "fulfilled" ? ', &lt;value&gt;: ' + state.value : '' } }<br>`;
    } else if (typeof arg === 'object') {
      divconsole.innerHTML += 'console.log arg:  ' + String(arg) + '<br>';
    }
    // add more else-ifs to handle strings, numbers, booleans, ... etc
  }
}

習慣console.logasynchronous、約束を別の約束で包むためである必要がありますこれがあなたがそれをすることができる唯一の方法です。

説明:

トリックはにあるrace約束p(利回りオブジェクトがいることを決議1に対する{}約束があれば)、p既に満たされ、その値が使用され、その値は他の約束(私たちはレースである1種のものと同じにすることはできませんので、に対して、をもたらすものに対して、{}私たちは約束が果たされたと判断します。私たちが得る価値が他の約束(オブジェクト{}の価値であり、解決された約束がレースに勝ったことを意味する場合、約束pはまだ履行されていないことを確信できます

エラーが発生した場合(catchコールバックが呼び出された場合)、promisepは拒否されます。

デモ:

function promiseState(p) {
  const t = {};
  return Promise.race([p, t])
    .then(v =>
      (v === t) ? { state: "pending" } : { state: "fulfilled", value: v },
      () => { state: "rejected" }
    );
}

console.log = async function(...args) {
  let divconsole = document.getElementById('main');
  
  for (let arg of args) {
    if (arg instanceof Promise) {
      let state = await promiseState(arg);
      divconsole.innerHTML += `Promise { &lt;state&gt;: "${ state.state }"${ state.state === "fulfilled" ? ', &lt;value&gt;: ' + state.value : '' } }<br>`;
    } else if (typeof arg === 'object') {
      divconsole.innerHTML += 'console.log arg:  ' + String(arg) + '<br>';
    }
  }
}

const pause =  sec => new Promise(r => setTimeout(r, 1000 * sec));

;(async function() {
  await new Promise(resolve => document.addEventListener('DOMContentLoaded', resolve));
  await pause(1);
  let divconsole = document.getElementById('main');

  let y = pause(0.5);
  await console.log(y);
  await y;
  await console.log(y);
})();
<div id="main" style="width:100%;height:auto;background-color:lightblue;"></div>

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

どのようにしてconsole.logにオブジェクトの現在の状態を表示させることができますか?

分類Dev

たとえば、文字列のようなオブジェクトを作成するにはどうすればよいですか?多くのプロパティを持つオブジェクト、およびデフォルトのconsole.log / evaluation値

分類Dev

たとえば、文字列のようなオブジェクトを作成するにはどうすればよいですか?多くのプロパティを持つオブジェクト、およびデフォルトのconsole.log / evaluation値

分類Dev

ドット表記を使用して、JavaScriptの配列とオブジェクトのプロトタイプにconsole.logメソッドをどのように追加しますか?

分類Dev

どうすればオブザーバブルの値をconsole.logに記録できますか?

分類Dev

JavaScriptオブジェクトと配列をconsole.logのようにwinstonに記録する方法は?

分類Dev

入力からconsole.logへの値をオブジェクトからの値を使用するにはどうすればよいですか?

分類Dev

Req.bodyは、オブジェクトをAPI POSTルートに渡すときに、サーバーconsole.logで{NaN: ""}を返します

分類Dev

console.logを使用してオブジェクトに値を表示する

分類Dev

オブジェクトに対してconsole.logを実行するときに表示するプロパティを指定するにはどうすればよいですか?

分類Dev

Console.logで非オブジェクトのプロパティを取得しようとしています

分類Dev

console.log は、オブジェクト オブジェクトを角度のある形式で表示します

分類Dev

Blobオブジェクトをconsole.log()するにはどうすればよいですか?

分類Dev

(Javascript)Console.logはオブジェクトの値を出力し、次の行に未定義を追加します

分類Dev

Javascriptでは、テンプレートリテラルを使用して、オブジェクトを反復処理しながら、オブジェクトのコンテンツをconsole.logに記録できますか?

分類Dev

プロトタイプなしで作成されたオブジェクトでconsole.logを使用するとエラーが発生し、文字列プロパティを使用して配列にアクセスできました。

分類Dev

Javascript console.logは、オブジェクトの値の代わりにc()を返します

分類Dev

js変数が[オブジェクトオブジェクト]を表示するのにconsole.log()が機能するのはなぜですか?

分類Dev

console.logに誤ったオブジェクトの値が表示されるのはなぜですか?

分類Dev

console.log()のテーブル表示で値を取得するにはどうすればよいですか?

分類Dev

console.logオブジェクトを再作成しようとしています

分類Dev

console.log()にのみ表示され、JSON.stringify()には表示されないJavaScriptオブジェクトからプロパティを取得するにはどうすればよいですか?

分類Dev

eslintのconsole.logのエラーをオフにします

分類Dev

Javascript alert()およびconsole.log()を介してオブジェクトを表示すると、異なる出力が表示されます

分類Dev

console.logは、Error.prototype.toStringとは異なるエラーオブジェクトをフォーマットします

分類Dev

オブジェクトのconsole.logをデバッグする

分類Dev

console.log(obj)のオブジェクトプロパティをChromeでアルファベット順に表示するにはどうすればよいですか?

分類Dev

キーダウンで、値のconsole.logがオブジェクトへの値の割り当てと異なるのはなぜですか?

分類Dev

console.logはオブジェクトのtoStringメソッドを呼び出しますか?

Related 関連記事

  1. 1

    どのようにしてconsole.logにオブジェクトの現在の状態を表示させることができますか?

  2. 2

    たとえば、文字列のようなオブジェクトを作成するにはどうすればよいですか?多くのプロパティを持つオブジェクト、およびデフォルトのconsole.log / evaluation値

  3. 3

    たとえば、文字列のようなオブジェクトを作成するにはどうすればよいですか?多くのプロパティを持つオブジェクト、およびデフォルトのconsole.log / evaluation値

  4. 4

    ドット表記を使用して、JavaScriptの配列とオブジェクトのプロトタイプにconsole.logメソッドをどのように追加しますか?

  5. 5

    どうすればオブザーバブルの値をconsole.logに記録できますか?

  6. 6

    JavaScriptオブジェクトと配列をconsole.logのようにwinstonに記録する方法は?

  7. 7

    入力からconsole.logへの値をオブジェクトからの値を使用するにはどうすればよいですか?

  8. 8

    Req.bodyは、オブジェクトをAPI POSTルートに渡すときに、サーバーconsole.logで{NaN: ""}を返します

  9. 9

    console.logを使用してオブジェクトに値を表示する

  10. 10

    オブジェクトに対してconsole.logを実行するときに表示するプロパティを指定するにはどうすればよいですか?

  11. 11

    Console.logで非オブジェクトのプロパティを取得しようとしています

  12. 12

    console.log は、オブジェクト オブジェクトを角度のある形式で表示します

  13. 13

    Blobオブジェクトをconsole.log()するにはどうすればよいですか?

  14. 14

    (Javascript)Console.logはオブジェクトの値を出力し、次の行に未定義を追加します

  15. 15

    Javascriptでは、テンプレートリテラルを使用して、オブジェクトを反復処理しながら、オブジェクトのコンテンツをconsole.logに記録できますか?

  16. 16

    プロトタイプなしで作成されたオブジェクトでconsole.logを使用するとエラーが発生し、文字列プロパティを使用して配列にアクセスできました。

  17. 17

    Javascript console.logは、オブジェクトの値の代わりにc()を返します

  18. 18

    js変数が[オブジェクトオブジェクト]を表示するのにconsole.log()が機能するのはなぜですか?

  19. 19

    console.logに誤ったオブジェクトの値が表示されるのはなぜですか?

  20. 20

    console.log()のテーブル表示で値を取得するにはどうすればよいですか?

  21. 21

    console.logオブジェクトを再作成しようとしています

  22. 22

    console.log()にのみ表示され、JSON.stringify()には表示されないJavaScriptオブジェクトからプロパティを取得するにはどうすればよいですか?

  23. 23

    eslintのconsole.logのエラーをオフにします

  24. 24

    Javascript alert()およびconsole.log()を介してオブジェクトを表示すると、異なる出力が表示されます

  25. 25

    console.logは、Error.prototype.toStringとは異なるエラーオブジェクトをフォーマットします

  26. 26

    オブジェクトのconsole.logをデバッグする

  27. 27

    console.log(obj)のオブジェクトプロパティをChromeでアルファベット順に表示するにはどうすればよいですか?

  28. 28

    キーダウンで、値のconsole.logがオブジェクトへの値の割り当てと異なるのはなぜですか?

  29. 29

    console.logはオブジェクトのtoStringメソッドを呼び出しますか?

ホットタグ

アーカイブ