覆盖console.log时如何显示Promise对象的状态和值

原子33ls

我正在尝试console.log在div中显示输出。我通过重写console.log功能来做到这一点

当我使用原始版本时console.log,诺言会在控制台中显示为(请参见下面代码中的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.log必须是asynchronous因为它将承诺包装在另一个承诺中。这是唯一的方法。

说明:

诀窍是针对已解决race的承诺p(产生对象{})的承诺,如果承诺p已经实现,则将使用其价值,并且由于其价值不能与另一个承诺(我们正在努力的那个)相同相对于产生的那一个{}),我们确定诺言已经兑现。如果我们获得的价值是另一个诺言(对象{})的价值,这意味着我们已解决的诺言赢得了比赛,那么我们可以确定诺言p尚未兑现。

如果我们收到错误消息(意味着catch回调被调用),则承诺将p被拒绝。

演示:

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

复制/覆盖javascript的console.log函数

来自分类Dev

使用Jest测试覆盖console.log

来自分类Javascript

覆盖console.log(); 用于生产

来自分类Dev

Chrome扩展程序console.log覆盖

来自分类Dev

覆盖JavaScript中的console.log

来自分类Javascript

如何使console.log显示对象的当前状态?

来自分类Dev

如何在覆盖它的网页上还原console.log?

来自分类Dev

如何覆盖 console.log 以便每个调用都有一个对象的 UUID?

来自分类Dev

如何根据状态显示Console.log?

来自分类Dev

通过Javascript alert()和console.log()显示对象时显示的不同输出

来自分类Dev

反应console.log不显示状态数组值

来自分类Dev

用Winston覆盖console.log |错误不再起作用

来自分类Dev

对对象进行console.log时如何指定要显示的属性?

来自分类Dev

使用console.log显示对象中的值

来自分类Dev

React,console.log和渲染显示不同的值

来自分类Dev

是否可以通过API从Google Search Console获取索引状态(新版本的索引覆盖率报告)

来自分类Dev

如何停止覆盖对象值

来自分类Dev

对象的属性未定义,即使对象上的console.log显示属性值

来自分类Dev

Console.log 显示正确的值,但映射值时该值未在 React/NextJS 中呈现

来自分类Dev

React:如何覆盖状态

来自分类Dev

axios和Promise,数组值不可用,但出现在console.log中

来自分类Dev

console.log()不显示实际值

来自分类Dev

为什么console.log显示不正确的对象值?

来自分类Dev

推送时覆盖值

来自分类Dev

例如,如何创建类似字符串的对象?具有许多属性和默认console.log / evaluation值的对象

来自分类Dev

如何使用数组PHP覆盖对象值

来自分类Dev

如何使用Object()覆盖JavaScript对象值

来自分类Dev

遍历对象时如何停止变量覆盖

来自分类Dev

如何扩展和覆盖样式对象 reactjs

Related 相关文章

  1. 1

    复制/覆盖javascript的console.log函数

  2. 2

    使用Jest测试覆盖console.log

  3. 3

    覆盖console.log(); 用于生产

  4. 4

    Chrome扩展程序console.log覆盖

  5. 5

    覆盖JavaScript中的console.log

  6. 6

    如何使console.log显示对象的当前状态?

  7. 7

    如何在覆盖它的网页上还原console.log?

  8. 8

    如何覆盖 console.log 以便每个调用都有一个对象的 UUID?

  9. 9

    如何根据状态显示Console.log?

  10. 10

    通过Javascript alert()和console.log()显示对象时显示的不同输出

  11. 11

    反应console.log不显示状态数组值

  12. 12

    用Winston覆盖console.log |错误不再起作用

  13. 13

    对对象进行console.log时如何指定要显示的属性?

  14. 14

    使用console.log显示对象中的值

  15. 15

    React,console.log和渲染显示不同的值

  16. 16

    是否可以通过API从Google Search Console获取索引状态(新版本的索引覆盖率报告)

  17. 17

    如何停止覆盖对象值

  18. 18

    对象的属性未定义,即使对象上的console.log显示属性值

  19. 19

    Console.log 显示正确的值,但映射值时该值未在 React/NextJS 中呈现

  20. 20

    React:如何覆盖状态

  21. 21

    axios和Promise,数组值不可用,但出现在console.log中

  22. 22

    console.log()不显示实际值

  23. 23

    为什么console.log显示不正确的对象值?

  24. 24

    推送时覆盖值

  25. 25

    例如,如何创建类似字符串的对象?具有许多属性和默认console.log / evaluation值的对象

  26. 26

    如何使用数组PHP覆盖对象值

  27. 27

    如何使用Object()覆盖JavaScript对象值

  28. 28

    遍历对象时如何停止变量覆盖

  29. 29

    如何扩展和覆盖样式对象 reactjs

热门标签

归档