2017-08-29 32 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(); 
    

我希望這有助於!