Promise-双括号在javascript中的含义以及如何访问它们

情况

我有以下使用Promise的功能。

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

var definitions = getDefinitions()

[[ ]]的内容为:

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

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

var value = definitions.PromiseValue; // undefined

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

Jeff asked 2019-11-08T09:25:57Z
8个解决方案
89 votes

return里面的东西是什么

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

这是内部财产。 您不能直接访问它。 本地承诺只能在return中与承诺一起解包,或者通常只能以异步方式进行解包-请参阅如何从异步调用返回响应。 引用规范:

它们仅出于说明目的由本规范定义。 ECMAScript的实现必须表现为好像它以此处描述的方式对内部属性进行了生产和操作。 内部属性的名称括在双方括号[[]]中。 当算法使用对象的内部属性并且该对象未实现所指示的内部属性时,将引发TypeError异常。

你不能

认真地-他们是什么?

非常好! 正如上面的引用所言,它们只是在规范中使用-因此没有理由让它们真正出现在您的控制台中。

不要告诉任何人,但这些实际上是私人符号。 它们存在的原因是其他内部方法能够访问return。例如,当io.js决定返回promise而不是进行回调时,如果可以保证,它们将允许其快速访问这些属性。 他们没有暴露在外面。

我可以访问它们吗?

除非您自己制作Chrome或V8版本,否则不要这么做。 也许在带有访问修饰符的ES7中,目前无法实现,因为它们不属于规范的一部分,并且会在浏览器中中断-抱歉。

所以我能得到我的价值吗?

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

尽管我不得不猜测-您没有正确地开始转换API,因为这种转换仅在方法是同步的情况下才起作用(在这种情况下,不返回诺言),或者它已经返回了诺言,这将使 它解决了(这意味着您根本不需要转换-只需return

Benjamin Gruenbaum answered 2019-11-08T09:27:31Z
12 votes

我今天也遇到了这个问题,偶然发现了一个解决方案。

我的解决方案如下所示:

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

此处dataWrappedByPromisePromise实例。 要访问Promise实例中的数据,我发现我只需要使用.json()方法解开该实例。

希望有所帮助!

cafemike answered 2019-11-08T09:28:14Z
1 votes

这个例子是带有react的,但是在大多数情况下应该是一样的。

使用您的网址替换this.props.url以便使其适用于大多数其他框架。

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

let results = fetch(this.props.url)
        .then((res) => {
            return res.json();
        })
        .then((data) => {
            return data;
        })
Lachlan Young answered 2019-11-08T09:28:57Z
0 votes

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

通过设计,承诺的即时状态和价值不能   从代码同步检查,而没有调用then()方法。

为了帮助调试,仅在检查promise对象时   手动,您可以将更多信息作为特殊属性   无法从代码访问(目前,这是通过   缺少属性,将属性名称随机化   语言或调试器支持)。

强调我的。 因此,您想做的事情无法完成。 更好的问题是,为什么需要这样访问promise状态?

Nit answered 2019-11-08T09:29:45Z
0 votes

这是访问PromiseValuepromise)的方法:

  let promises = definitions;

  Promise.all(promises).then((promise) => {
    console.log('promises = ', promises);

    console.log('promise = ', promise);
  });
caot answered 2019-11-08T09:30:12Z
-1 votes

尝试使用等待。

代替

var value = definitions.PromiseValue 

采用

var value =  await definiton;

这可以通过产生承诺值来解决您的目的。

请注意,await只能在异步函数中使用,它是ES2016的功能。

himanshu verma answered 2019-11-08T09:31:04Z
-2 votes

我认为这样做会很好。

(async () => {
  let getDefinitions = await ( () => {
    return new Promise( (resolve, reject) => {
      resolve(ContactManager.request("definition:entities"));
    });
  })();
)();
Shun ITOH answered 2019-11-08T09:31:31Z
-3 votes

对所提供解决方案的细微变化/扩展

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

fetch('http://localhost:3000/hello')
  .then(response => response.text())
  .then(data => {
    // you can see your PromiseValue data here
    console.log(data)
  })
Hari Kiran Mutyala answered 2019-11-08T09:32:06Z
translate from https://stackoverflow.com:/questions/28916710/what-do-double-brackets-mean-in-javascript-and-how-to-access-them