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