这是我要在应用程序中尝试执行的操作的简单版本。我有一个if语句后者评估函数调用的结果,然后如果该语句回来为真正的填充阵列。在if语句完全完成之后,我想运行更多代码,例如console.log,如下所示。
据我所知,如果的评估时间过长光洁度和javascript只是继续到的console.log因为它的异步性。如何使代码等待if语句完成?
var tabs = [];
if (isTrue()) {
tabs.push('some string');
}
console.log(tabs[1]);
function isTrue() {
setTimeout(function() {
return true;
}, 500)
}
答案 0 :(得分:1)
您可以将回调传递给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);
应该工作。
答案 1 :(得分:1)
使用现代javascript,您可以使用promises和async/await来实现:
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();
(此代码还将isTrue
用于arrow functions。)
答案 2 :(得分:1)
答案 3 :(得分:0)
isTrue()
返回 undefined 。 return true
回调内部的setTimeout
将返回到超时调用,而不是isTrue()
调用。该代码执行immeadiately并且没有asynchronity涉及(除了计时器,什么也不做)。