2017-08-29 70 views
2

我打电话这段代码:异步调用返回的功能与数字无极对象属性名称

Permissions.check('photo') 
     .then(response => { 
     ... 
     }); 

在这里,我可以使用response对象来检查值。
但是我想叫这个的await这样的:

async function test() { 
    let test = await Permissions.check('photo'); 
    return test; 
} 
... 
let result = test(); 

但这返回我看起来像这样的承诺对象:

Promise {_40: 0, _65: 0, _55: null, _72: null} 

和价值,我通常在response这里我result._55得到得到。
我能做些什么来获得正确的对象?

+0

如果结合'await'和'then',它会起作用。但我认为这是一个不好的做法。尝试'让测试;等待Permissions.check('photo')。然后((response)=> test = response);' –

+0

我之前问过类似的问题,这里有一个非常有用的信息在接受的答案:https://stackoverflow.com/问题/ 45765114/how-to-a-function-or-a-database-query-and-then-process-results-and-fi –

回答

0

您是否期望能够像这样以同步的方式使用test

let result = test(); 
result._55; // ... 

我很抱歉让你失望,但那不行。

异步函数不会将异步操作转换为同步操作。异步函数返回一个包含return ...语句中的值的承诺。这意味着你的test功能等同于:

function test() { 
    return Permissions.check('photo').then(result => result); 
} 

...这是毫无意义的,因为你现在可以使用这样的:

test().then(response => { 
    response._55; // ... 
}); 

只是你的第一个解决方案坚持。

+0

这是一条评论或答复? –

+1

@KhalilKhalaf,不,OP从未说第一个解决方案不起作用。他们只是希望async函数'test'提供更好的(“同步”)访问'result'对象的方法。我解释过'test'不会返回这个'result'对象,而是一个包装这个对象的promise。 – PeterMader

1

以下几个选项,你必须:

  1. 棒,不管你已经在做的。

    function main() { 
        Permissions.check('photo') 
        .then(response => { 
         ... 
        }); 
    } 
    main(); 
    
  2. 如果你想要做这样的事情let result = Permissions.check()其中Permissions.check()返回一个承诺,你的实际需要(一)使用await关键字和(b)把let result语句中async函数中。

    async function main() { 
        let result = await Permissions.check('photo'); 
    } 
    main(); 
    

我希望这有助于!