我有以下功能,试图使用Promises。
var getDefinitions = function(){
return new Promise(function(resolve){
resolve(ContactManager.request("definition:entities"));
});
}
var definitions = getDefinitions()
正在返回:
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: child}
我想获得PromiseValue的值,但要求
var value = definitions.PromiseValue
给了我一个未定义的结果。
我的问题是双括号[[ ]]
的含义是什么,以及如何检索[[PromiseValue]]
的值。
答案 0 :(得分:78)
[[]]
我的问题是双括号[[]]的含义是什么,以及如何检索[[PromiseValue]]的值。
这是一个内部财产。您无法直接访问它。原生承诺只能在then
中使用承诺解包,或者通常不同步地展开 - 请参阅How to return the response from an asynchronous call。引用规范:
它们仅由出于说明目的而由本规范定义。 ECMAScript的实现必须表现得就像它以此处描述的方式在内部属性上生成和操作一样。 内部属性的名称用双方括号[[]] 括起来。当算法使用对象的内部属性并且该对象未实现指示的内部属性时,将抛出TypeError异常。
你不能
非常好!正如上面的引言所说它们只是在规范中使用 - 所以它们没有理由真正出现在你的控制台中。
不要告诉任何人,但这些确实是私人符号。它们存在的原因是其他内部方法能够访问[[PromiseValue]]
。例如,当io.js决定返回promises而不是回调时 - 这些将允许它在保证的情况下快速访问这些属性。他们不暴露在外面。
除非您制作自己的Chrome或V8版本。也许在带有访问修饰符的ES7中,现在没有办法,因为它们不是规范的一部分,并且会突破浏览器 - 抱歉。
getDefinitions().then(function(defs){
//access them here
});
虽然如果我不得不猜测 - 你是not converting the API correctly to begin with,因为这种转换仅在方法是同步的情况下才会起作用(在这种情况下不返回一个保证)或者它会返回一个已经做出的承诺它已解决(这意味着您根本不需要转换 - 只需return
。
答案 1 :(得分:11)
我今天也遇到了这个问题,碰巧找到了解决方案。
我的解决方案如下:
fetch('http://localhost:3000/hello')
.then(dataWrappedByPromise => dataWrappedByPromise.json())
.then(data => {
// you can access your data here
console.log(data)
})
此处,dataWrappedByPromise
是Promise
个实例。要访问Promise
实例中的数据,我发现我只需要使用.json()
方法展开该实例。
希望有所帮助!
答案 2 :(得分:3)
这个示例是反应,但大多数情况下应该是相同的。
将<。strong> this.props.url替换为您要提取的网址,以使其适用于大多数其他框架。
解析 res.json()会返回[[promiseValue]]但是如果您将其返回到下面的另一个 .then()方法,则可以将其返回为一个完整的数组。
let results = fetch(this.props.url)
.then((res) => {
return res.json();
})
.then((data) => {
return data;
})
答案 3 :(得分:0)
阅读the manpage,我们可以看到:
按照设计,承诺的即时状态和价值不可能 从代码中同步检查,而不调用
then()
方法。仅在检查promise对象时帮助调试 手动,您可以看到更多信息作为特殊属性 代码无法访问(目前,这是由 随机化属性名称,因为缺乏更复杂的 语言或调试器支持)。
强调我的。因此,你想做的事情是无法做到的。更好的问题是为什么你需要像那样访问承诺状态吗?
答案 4 :(得分:0)
我认为它会很顺利。
(async () => {
let getDefinitions = await ( () => {
return new Promise( (resolve, reject) => {
resolve(ContactManager.request("definition:entities"));
});
})();
)();
答案 5 :(得分:0)
对于返回的响应是HTML而非JSON的情况
fetch('http://localhost:3000/hello')
.then(response => response.text())
.then(data => {
// you can see your PromiseValue data here
console.log(data)
})
答案 6 :(得分:0)
以下是访问PromiseValue
(promise
)的方法:
let promises = definitions;
Promise.all(promises).then((promise) => {
console.log('promises = ', promises);
console.log('promise = ', promise);
});
答案 7 :(得分:-1)
尝试使用等待。
代替
var value = definitions.PromiseValue
使用
var value = await definiton;
这可以通过产生承诺值来解决您的目的。
请注意,它只能在异步函数中使用,这是ES2016的功能。