Javascript 我如何让这个if语句在其余代码运行之前完成执行?

Javascript 我如何让这个if语句在其余代码运行之前完成执行?,javascript,Javascript,这是我在应用程序中尝试执行的操作的简单版本。我有一个if语句,它计算函数调用的结果,然后在该语句返回为true时填充数组。在if语句完全完成之后,我想运行更多的代码,如下面所示的console.log 我知道if的评估需要很长时间才能完成,而javascript由于其异步性而只会继续访问console.log。如何使代码等待if语句完成 var tabs = []; if (isTrue()) { tabs.push('some string'); } console.log(tab

这是我在应用程序中尝试执行的操作的简单版本。我有一个if语句,它计算函数调用的结果,然后在该语句返回为true时填充数组。在if语句完全完成之后,我想运行更多的代码,如下面所示的console.log

我知道if的评估需要很长时间才能完成,而javascript由于其异步性而只会继续访问console.log。如何使代码等待if语句完成

var tabs = [];

if (isTrue()) {
    tabs.push('some string');
}

console.log(tabs[1]);

function isTrue() {
    setTimeout(function() {
        return true;
    }, 500)
}

isTrue()
返回未定义的。
setTimeout
回调内部的
return true
将返回超时调用,而不是
isTrue()
调用。代码立即执行,不涉及异步性(除了不执行任何操作的计时器)。

您可以将回调传递给
isTrue()
函数,类似于:

function isTrue(_callback) {
    setTimeout(function() {
        // code here

        // Call the callback when done
        if (typeof(_callback) === 'function')
            _callback(tabs);
    });
}

function showTabs(tabs) {
    console.log(tabs[1]);
}

isTrue(showTabs);

应该可以工作。

使用现代javascript,您可以使用和:

const isTrue=()=>新承诺(resolve=>setTimeout(resolve,500,true));
//只能在'async'函数中使用'await'
异步函数main(){
//最好使用'let'而不是'var',因为'let'是块作用域,
//见:
// 
设tabs=[];
if(wait isTrue()){
tabs.push('somestring');
}
//数组的索引以0开始,而不是1
console.log(制表符[0]);
}
main();

(此代码也用于
isTrue

您只需将代码包装在中,并通过调用它来使用返回的值:

var选项卡=[];
isTrue()。然后(res=>{
如果(res){
tabs.push('somestring');
}
返回标签;
})。然后(arr=>{
控制台日志(arr);
});
函数isTrue(){
//只需将现有代码包装在承诺构造函数中
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
//传递以后要使用的任何值以进行解析
决心(正确);
}, 500)
});

}
您可以将isTrue定义为接受回调的函数
const isTrue = () => new Promise(resolve => setTimeout(resolve, 500, true));

// you can only use `await` inside an `async` function
async function main() {
  // better use `let` instead of `var` since `let` is block scoped,
  // see:
  // <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let>

  let tabs = [];

  if (await isTrue()) {
    tabs.push('some string');
  }

  // array's index start by 0, not 1
  console.log(tabs[0]);
}

main();