javascript获得价值而不是承诺

javascript获得价值而不是承诺,javascript,asynchronous,promise,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].ur

我想从承诺中获得价值,但不知道如何实现

我试着这样做:

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
}

第一个函数被拒绝,第二个函数被完全填充。

async
函数返回
promise
,因此只能得到
promise
。 我也是

我想从承诺中获得价值,但不知道如何实现

从承诺中获取值的唯一方法是使用
。然后()
在承诺上或在同一函数中,可以使用
wait

async
函数始终返回承诺。在函数中,您可以使用
wait
来“等待”承诺以获取值,但函数的返回值并非如此。函数总是返回一个承诺,您总是使用
wait
.then()
从承诺中获取值

因此,您的第二个
getURL()
函数返回一个承诺,该承诺的解析值就是您想要的url。要获得该值,请对返回的承诺使用
.then()

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

getURL().then(url => {
    console.log(url);
});
或者,在这里使用
wait
并没有什么大的优势,所以您也可以这样做:

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

}

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


您的第一个版本的
getURL()
不起作用,因为您的函数在调用
之前返回。然后()
处理程序被调用,因此您总是返回

异步
等待
-这些解析承诺并直接为您提供值。
删除wait和
。然后
工作。

如果您使用
wait
您不需要
then()
,也可以将
var url=getURL()
更改为
var url=wait getURL()
。如果你等待,你会直接得到结果。我建议你花20分钟读一读承诺。它将澄清很多问题,您将能够自己修复代码。例如,从这里开始:我试过这样的代码:var url=getURL(),然后(function(resp){url=resp});但“url”仍然是一个问题promise@R.Kut-是的
getURL()。然后()
返回一个承诺。无法在
.then()
处理程序之外获取数据。异步操作就是这样工作的。必须在
.then()处理程序中使用结果。
function getURL() {
    return browser.tabs.query({currentWindow: true, active: true}).then(tab => {
        return tab[0].url;
    });

}

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