Javascript 无法从承诺中获取对象

Javascript 无法从承诺中获取对象,javascript,callback,promise,es6-promise,Javascript,Callback,Promise,Es6 Promise,我有以下代码: const a = { Top: { fun: () => { return { sub: { variable: getResponse().then((response) => response) } }; } } }; getResponse()返回一个Promi

我有以下代码:

const a = {
    Top: {
        fun: () => {
            return {
                sub: {
                    variable: getResponse().then((response) => response)
                }
            };
        }
    }
};
getResponse()返回一个Promise.resolve()

然后,我尝试通过执行以下操作获取另一个文件中变量的值:

let test = importedFile.a.Top.fun().sub.variable.then((resp) => resp);
但是当我打印出test的值时,我得到的不是
变量的值,而是

承诺{
,
域:
领域{
域:空,
_事件:{错误:[函数:handleException]},
_事件提示:1,
_maxListeners:未定义,
成员:[]}

我确信在实际常量中,变量被设置为正确的值。我只是不确定如何单独访问这个


我的问题是唯一的,因为另一个问题的解决方案不能解决这个问题。

这是因为您为变量指定了承诺。如果您的
getResponse()
函数返回承诺,则使用
链接,则
catch
仍将返回承诺,以便您可以继续将函数链接到承诺。您正在寻找的是以下内容:

importedFile.a.Top.fun().sub.variable.then(response => {
    // Continue executing code based on the value of this variable...
    // Where 'response' is equal to what you intended 'test' to be from your original post
});

一旦一个值被封装在一个承诺中,就不可能将其收回。这是故意的。您必须编写在
块的上下文中使用封装值的代码。这会阻止您在异步代码解析该值之前使用该值

let test = importedFile.a.Top.fun().sub.variable.then((resp) => resp);
expect(test).to.equal(resp); 
这不起作用,因为
测试
承诺
,而不是
类型的resp

你需要这样做

importedFile.a.Top.fun().sub.variable.then((resp) => resp)
  .then(value => {
    expect(value).to.equal(resp);
  });

((响应)=>resp)
?什么是
resp
?然后调用
的结果仍然是一个承诺<代码>然后((x)=>x)
没有做任何有用的事情。您需要在回调中使用
response
。@mpm然后呢<代码>测试
不用于你的
然后
回调。可能重复的可能重复,或者当你简单地谷歌“js然后返回承诺而不是值”时的任何问题。你也可以阅读.user8895105,听听别人告诉你什么。所有的评论和两个答案都在说同一件事。你的问题绝非独一无二。许多第一次遇到承诺的人都会遇到同样的问题。一旦你成功地将注意力集中在承诺上,他们将是你最好的朋友。将解析值指定给承诺上下文之外的变量通常是个坏主意。承诺异步执行,因此无法保证何时分配
test
的值。如果在示例后面的行中使用了
test
,则它可能是
未定义的