Javascript 在执行第二个JS之前,请等待一个函数完成

Javascript 在执行第二个JS之前,请等待一个函数完成,javascript,google-chrome-extension,Javascript,Google Chrome Extension,第二个函数有问题。它在“w”中保存值之前运行。我试过setTimout(),但没用。我正在尝试实现async/await,但我正在努力解决它与以下代码的匹配问题: function functionOne(){ var s chrome.storage.local.get(['prm'], function(result) { s = result.prm; return s; }); } function functionT

第二个函数有问题。它在“w”中保存值之前运行。我试过setTimout(),但没用。我正在尝试实现async/await,但我正在努力解决它与以下代码的匹配问题:

function functionOne(){

    var s
    chrome.storage.local.get(['prm'], function(result) {
        s = result.prm;
        return s;    
    });
}


function functionTwo(){

    let w = functionOne();
    
    // second half runs after w is assigned a value (after functionOne is done running).  
    
}

async/await是唯一的解决方案还是有其他解决方法?

您必须使用一个不能同时工作的异步函数。 你可以这样做

function functionOne(){
    var s
    chrome.storage.local.get(['prm'], function(result) {
        s = result.prm;
        return s;    
    });
}


async function functionTwo(){

    await let w = functionOne();
    
    // second half runs after w is assigned a value (after functionOne is done running).  
    
}
此处引用:


注意:我还想指出functionOne实际上返回一个未定义的值,因为在chrome.storage.local.get函数中,回调函数返回s,因此您需要将return语句移到回调函数之外。

使用 及

functionOne()函数{
var s
chrome.storage.local.sync.get(['prm'],函数(结果){
s=结果.prm;
返回s;
});
}
异步函数functionTwo(){
设w=wait functionOne();
//在w被赋值后(在functionOne完成运行后)运行下半部分。
}

异步/等待不是唯一的解决方案。在任何情况下,您都需要在functionOne中创建承诺

/*async*/ function functionOne(){

    var s;
    var p = new Promise(function(success) {
      chrome.storage.local.get(['prm'], function(result) {
        s = result.prm;
        success(s);    
      });
    }
    return p;
}


function functionTwo(){

    let p = functionOne();
    p.then(function(s) {
      //...
    });
        
}

您需要承诺能够返回chrome.log.storage的结果。可以使functionOne异步,也可以不异步。它不会改变任何东西。

这不起作用,因为
返回s
只从内部函数返回。另外,如果functionOne不是异步的,您不能等待它,因为它不会返回承诺“因此您需要将return语句移到回调函数之外。”您不能这样做!函数1在回调运行之前就已经返回了。唯一能让它起作用的方法就是承诺,就像我已经展示的那样,这非常有效,谢谢@ControlAltDel。起初它不起作用,因为我在检查函数2中p的值,而不是s的值。但它现在起作用了。