[[PromiseValue]]在javascript控制台中意味着什么,以及如何获取它

Jef*_*eff 59 javascript promise es6-promise

我有以下功能,试图使用Promises.

var getDefinitions = function() {
    return new Promise(function(resolve) {
        resolve(ContactManager.request("definition:entities"));
    });
}

var definitions = getDefinitions()
Run Code Online (Sandbox Code Playgroud)

definitions 正在回归:

Promise {
    [[PromiseStatus]]: "resolved",
    [[PromiseValue]]: child
}
Run Code Online (Sandbox Code Playgroud)

我想获得PromiseValue的价值,但要求

var value = definitions.PromiseValue; // undefined
Run Code Online (Sandbox Code Playgroud)

给了我一个不确定的结果.

我的问题是双括号是什么PromiseValue意思,我该如何检索它的值[[ ]].

Ben*_*aum 91

里面的东西是什么 [[]]

我的问题是双括号[[]]的含义是什么,以及如何检索[[PromiseValue]]的值.

这是一个内部财产.您无法直接访问它.本机承诺通常只能then用promises 解包或异步 - 请参阅如何从异步调用返回响应.引用规范:

它们仅由出于说明目的而由本规范定义.ECMAScript的实现必须表现得就像它以此处描述的方式在内部属性上生成和操作一样.内部属性的名称用双方括号[[]]括起来.当算法使用对象的内部属性并且对象未实现指示的内部属性时,将引发TypeError异常.

你不能

说真的 - 他们是什么?

非常好!正如上面的引言所说它们只是在规范中使用 - 所以它们没有理由真正出现在你的控制台中.

不要告诉任何人,但这些都是私人符号.它们存在的原因是其他内部方法能够访问[[PromiseValue]].例如,当io.js决定返回promises而不是回调时 - 这些将允许它在保证的情况下快速访问这些属性.他们暴露在外面.

我可以访问它们吗?

除非您制作自己的Chrome或V8版本.也许在带有访问修饰符的ES7中,现在没有办法,因为它们不是规范的一部分,并且会突破浏览器 - 抱歉.

所以我知道我的价值吗?

getDefinitions().then(function(defs){
    //access them here
});
Run Code Online (Sandbox Code Playgroud)

虽然如果我不得不猜测 - 你没有正确地转换API,因为这种转换仅在方法是同步的情况下才有效(在这种情况下不返回一个promise)或者它返回一个已经做出的承诺它解决了(这意味着你根本不需要转换 - 只是return.


caf*_*ike 13

我今天也遇到了这个问题,碰巧找到了解决方案.

我的解决方案如下所示:

fetch('http://localhost:3000/hello')
.then(dataWrappedByPromise => dataWrappedByPromise.json())
.then(data => {
    // you can access your data here
    console.log(data)
})
Run Code Online (Sandbox Code Playgroud)

dataWrappedByPromise是一个Promise实例.为了访问Promise实例中的数据,我发现我只需要用该方法解包该实例.json().

希望有所帮助!


Lac*_*ung 5

这个例子是用 react 但在大多数情况下它应该是相同的。

this.props.url替换为您要获取的 url 以使其适用于大多数其他框架。

解析res.json()返回 [[promiseValue]] 但是,如果您随后将其返回到下面的另一个.then()方法,则可以将其作为总数组返回。

let results = fetch(this.props.url)
        .then((res) => {
            return res.json();
        })
        .then((data) => {
            return data;
        })
Run Code Online (Sandbox Code Playgroud)


Nit*_*Nit 0

阅读联机帮助页,我们可以看到:

根据设计,如果不调用该方法,则无法从代码中同步检查 Promise 的即时状态和值then()

为了帮助调试,只有在手动检查 Promise 对象时,您才能看到更多信息作为代码无法访问的特殊属性(目前,由于缺乏更复杂的语言或调试器支持,这是通过随机化属性名称来实现的) )。

强调我的。因此,你想做的事情是做不到的。更好的问题是为什么你需要这样访问承诺状态?