我如何获得这个if语句来完成的代码运行的其余部分之前执行?

时间:2019-02-02 22:07:41

标签: javascript

这是我要在应用程序中尝试执行的操作的简单版本。我有一个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)
}

4 个答案:

答案 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,您可以使用promisesasync/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)

您可以将代码包装在Promise中,并通过在其上调用then使用返回的值:

    "terser": "3.14.1",

答案 3 :(得分:0)

isTrue()返回 undefined return true回调内部的setTimeout将返回到超时调用,而不是isTrue()调用。该代码执行immeadiately并且没有asynchronity涉及(除了计时器,什么也不做)。