【问题标题】:why integer value returns when I console.log my promise为什么当我 console.log 我的承诺时返回整数值
【发布时间】:2020-05-13 22:38:52
【问题描述】:

我想知道为什么当我 console.log 我的承诺时返回整数值。

var promise = new Promise(function(resolve, reject) {
    setTimeout(function() {
        resolve('hello world');
    }, 2000);
});

promise.then(function(data) {
    console.log(data);
});

setTimeout(() => console.log("after: ", promise), 3000);

输出:

但如果我在我的承诺解决后删除了 console.log,则不会返回任何整数。 为什么会发生这种情况?

【问题讨论】:

  • 当您在控制台中运行命令时,它们的返回值会被记录下来
  • 没有在这里的终端上得到一个数字输出,我也没想到。 @HereticMonkey setTimeout 没有直接在终端上运行,赋值为undefined。我误会了什么?
  • @Mark 它正在运行。如果您只查看图像,则会丢失分号后的省略号,这会省略 OP 代码块中也粘贴到控制台中的其余代码。
  • 知道了——这是最后一个 setTimeout 谢谢@HereticMonkey。

标签: javascript promise


【解决方案1】:

解释这里发生的事情的一种方法是使用 Stack Snippets,其中包括控制台的自定义实现。这是 sn-p 中的原始代码。随意点击“运行代码sn-p”:

var promise = new Promise(function(resolve, reject) {
    setTimeout(function() {
        resolve('hello world');
    }, 2000);
});

promise.then(function(data) {
    console.log(data);
});

setTimeout(() => console.log("after: ", promise), 3000);

请注意,没有显示数字。这是因为自定义实现不会回显调用的函数的返回值,除非它们通过console.log 记录下来。几乎所有浏览器都可以,甚至 IE(无论如何都是 v11)。

因此,如果您要在控制台中运行以下行,您会看到类似的内容:

setTimeout(function () { console.log('done'); }, 100);

只是一些数字。这个数字当然很方便。您可以将其传递给clearTimeout 以阻止超时发生:

var id = setTimeout(function () { console.log('done'); }, 100);
clearTimeout(id);

那不应该记录“完成”。

所以,要明确一点,这与promise 无关,也与传递给promise 构造函数的函数内部使用的setTimeout 无关;仅在 3 秒后记录 promise 变量值的最后一个 setTimeout 调用,并且仅在浏览器控制台中。

哦,至少有一个浏览器 (Firefox) 喜欢隐藏正在运行的代码 :)。

【讨论】:

    猜你喜欢
    • 2017-07-23
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    相关资源
    最近更新 更多