双括号在 javascript 中意味着什么以及如何访问它们

情况

我有以下函数使用 我保证

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


var definitions = getDefinitions()

definitions的内容如下:

Promise {
[[PromiseStatus]]: "resolved",
[[PromiseValue]]: child
}

直接访问 PromiseValue属性将返回 未定义

var value = definitions.PromiseValue; // undefined

提问

双括号 [[ ]]是什么意思,以及如何检索 [[PromiseValue]]的值。

61360 次浏览

阅读 壁纸,我们可以看到:

按照设计,一个承诺的即时状态和价值不可能是 从代码同步检查,而不调用 then()方法。

要帮助调试,仅在检查承诺对象时使用 < strong > 手动地,您可以看到更多信息作为特殊属性,这些属性是 不能从代码 访问(目前,这是由 随机的属性名称,因为缺乏更复杂的 语言或调试器支持)。

重点是我的。因此,你想做的事情是不可能做到的。更好的问题是 为什么需要像这样访问承诺状态吗?

[[]]里面是什么东西

我的问题是,双括号[[]]是什么意思,以及如何检索[[  承诺价值]]的值。

这是内部财产。你不能直接访问它。本机承诺只能在 then中使用承诺或在一般情况下使用异步方式解包装-参见 如何从异步调用返回响应。引用说明书:

它们由本规范定义,纯粹是为了说明目的。ECMAScript 的实现必须按照下面描述的方式生成和操作内部属性。内部属性的名称用双方括号[[]]括起来.当算法使用对象的内部属性而该对象没有实现指示的内部属性时,将引发 TypeError 异常。

你不能

说真的,那是什么?

非常好!正如上面的报价说,他们只是在规范中使用-所以没有理由让他们真正出现在您的控制台。

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

我能看看吗?

除非你自己制作 Chrome 或 V8版本。也许在 ES7中使用访问修饰符。到目前为止,还没有办法,因为它们不属于规范的一部分,并且将在不同浏览器之间发生冲突——抱歉。

那么我如何得到我的价值呢?

getDefinitions().then(function(defs){
//access them here
});

但是如果它返回一个错误呢?为了预见这些情况,请在您的。那么(())。

.catch(function(defs){
//access them here
});

尽管如果我不得不猜测——你是 没有从一开始就正确地转换 API,因为这个转换只有在方法是同步的情况下才能工作(在这种情况下不返回一个承诺)或者它已经返回一个承诺,这将使它解决(这意味着你根本不需要转换-只需要 return

我觉得这个很配。

(async () => {
let getDefinitions = await ( () => {
return new Promise( (resolve, reject) => {
resolve(ContactManager.request("definition:entities"));
});
})();
)();

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

我的解决方案是这样的:

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

在这里,dataWrappedByPromise是一个 Promise实例。要访问 Promise实例中的数据,我发现只需要使用 .json()方法访问 打开实例。

希望能帮上忙!

这个 示例使用的是 response,但在大多数情况下应该是相同的。

用 url 替换 this.pros.url,使其适用于大多数其他框架。

解析 Res.json ()会返回[[ nomeValue ]] ,但是如果您将它返回给下面的另一个 。然后()方法,您可以将它作为一个总数组返回。

let results = fetch(this.props.url)
.then((res) => {
return res.json();
})
.then((data) => {
return data;
})

对于返回的响应是 HTML 而不是 JSON 的情况

fetch('http://localhost:3000/hello')
.then(response => response.text())
.then(data => {
// you can see your PromiseValue data here
console.log(data)
})

尝试使用 等待

而不是

var value = definitions.PromiseValue

使用

var value =  await definiton;

这可能通过让出承诺价值来解决你的目标。

请注意, wait 只能在异步函数中使用,它是 ES2016的一个特性。