2017-03-22 193 views
0

如何在一個Promise(在這種情況下的OAuth2)已滿的情況下暫停他的Javascript函數,以便我可以獲得應該返回的重定向URL?等待承諾滿員(Javascript)

在Firefox中使用Webextension定期JS,運行最新的Firefox開發者(54.0a2)

function fetchOAuth2() 
{ 
    var redirectURL = browser.identity.getRedirectURL() + "page.html"; 
    console.log(redirectURL); 
    var clientID = "CLIENT ID"; 
    var authURL = "https://trakt.tv/oauth/authorize"; // API I'm using 
    authURL += `?response_type=code`; 
    authURL += `&client_id=${clientID}`; 
    authURL += `&redirect_uri=${redirectURL}`; 
    console.log(authURL); 
    var authorizationCode = browser.identity.launchWebAuthFlow({ 
     interactive: true, 
     url: authURL 
    }); 
} 

回答

0

但是也有一些有效的不同的方法,所以挑你喜歡/一與您的代碼最適合。

使用promise.then()

function fetchOAuth2() 
{ 
    var redirectURL = browser.identity.getRedirectURL() + "page.html"; 
    console.log(redirectURL); 
    var clientID = "CLIENT ID"; 
    var authURL = "https://trakt.tv/oauth/authorize"; // API I'm using 
    authURL += `?response_type=code`; 
    authURL += `&client_id=${clientID}`; 
    authURL += `&redirect_uri=${redirectURL}`; 
    console.log(authURL); 

    browser.identity.launchWebAuthFlow({ 
     interactive: true, 
     url: authURL 
    }) 
    .then(function(authResult) { 
     // do something with authResult 
    }) 
} 

如果您要訪問的authResult這個功能之外,那麼你就需要返回的承諾,並從調用點then它,即

function fetchOAuth2() 
{ 
    var redirectURL = browser.identity.getRedirectURL() + "page.html"; 
    console.log(redirectURL); 
    var clientID = "CLIENT ID"; 
    var authURL = "https://trakt.tv/oauth/authorize"; // API I'm using 
    authURL += `?response_type=code`; 
    authURL += `&client_id=${clientID}`; 
    authURL += `&redirect_uri=${redirectURL}`; 
    console.log(authURL); 

    return browser.identity.launchWebAuthFlow({ 
     interactive: true, 
     url: authURL 
    }) 
} 

fetchOAuth2().then(function(authResult) { 
    // do something with auth result 
}); 

使用ES7異步/等待

這是一個相對較新的語言功能,但它在FF54中受支持。如果您需要支持其他瀏覽器,則必須使用Babel才能兼容。

async function fetchOAuth2() 
{ 
    var redirectURL = browser.identity.getRedirectURL() + "page.html"; 
    console.log(redirectURL); 
    var clientID = "CLIENT ID"; 
    var authURL = "https://trakt.tv/oauth/authorize"; // API I'm using 
    authURL += `?response_type=code`; 
    authURL += `&client_id=${clientID}`; 
    authURL += `&redirect_uri=${redirectURL}`; 
    console.log(authURL); 

    var authResult = await browser.identity.launchWebAuthFlow({ 
     interactive: true, 
     url: authURL 
    }); 

    // do something with authResult 
} 
+0

非常感謝您的快速回復!並感謝您的多種選擇+信息,alw ays很高興知道!不幸的是,它似乎沒有辦法。可能是一個webextension的東西(因爲browser.identity.launchWebAuthFlow()打開一個新窗口),但由於某種原因,這些解決方案都沒有工作。我總是在等待foo.then(console.log(「test」))之後進行測試,但沒有控制檯輸出。有任何想法嗎? – FStijn

+0

檢查控制檯中的錯誤,但使用Ctrl + J打開** browser **控制檯,以便您也可以看到擴展中的錯誤。 – trincot

+0

@trincot我得到的是: 在btgallery.js返回語句後無法訪問的代碼:1:52329(不是我的,據我所知) ReferenceError:事件未定義pop.js:4:6264(不是我的據我所知) 我自己的應用程序,不幸的是 – FStijn