javascript获取价值而不是承诺

时间:2018-01-10 08:50:55

标签: javascript asynchronous promise

我想从承诺中获取价值,但不知道如何。

我试过这种方式:

function connected(p) {

var url = getURL();

async function getURL() {
    var test = "";
    let tab = await browser.tabs.query({currentWindow: true, active: true});
    tab.then(function(tabb){
        test = tabb[0].url.toString()
    });
    return test;
}

async function getURL() {
    var tab = await browser.tabs.query({currentWindow: true, active: true});
    return tab[0].url;
}

    console.log(url.toString()); // Promise
}

第一个功能被拒绝,第二个功能被填满。

3 个答案:

答案 0 :(得分:1)

async函数返回promise,因此您只能获得promise

var url = getUrl()
url.then((resp) => {console.log(resp)}); 

答案 1 :(得分:1)

  

我想从承诺中获取价值,但不知道如何。

从承诺中获取值的唯一方法是在承诺上或在同一函数中使用.then(),您可以使用await

async函数始终返回一个promise。在函数中,您可以使用await来等待"等待"获取值的承诺,但函数的返回值不是这种情况。该函数始终返回一个承诺,您始终使用await.then()从承诺中获取值。

因此,您的第二个getURL()函数会返回一个承诺,即已解析的值是您想要的网址。要获得该值,请在返回的承诺上使用.then()

async function getURL() {
    var tab = await browser.tabs.query({currentWindow: true, active: true});
    return tab[0].url;
}

getURL().then(url => {
    console.log(url);
});

或者,在这里使用await真的没什么大优势,所以你也可以这么做:

function getURL() {
    return browser.tabs.query({currentWindow: true, active: true}).then(tab => {
        return tab[0].url;
    });

}

getURL().then(url => {
    console.log(url);
});

您的getURL()的第一个版本不起作用,因为您的函数在调用.then()处理程序之前返回,因此您始终只返回""

答案 2 :(得分:1)

asyncawait - 这些可以解决承诺并直接为您提供价值。 删除等待和.then有效。