是否有更好的条件setTimeout模式?

时间:2017-11-16 18:26:03

标签: javascript

我有以下代码:

if (isFlyoutAnimationDisabled) {
  flyOut();
} else {
  setTimeout(flyOut, 250);
}

似乎应该有比在每个if条件下调用flyOut更好的模式。似乎浪费了我并污染了代码。

有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

如果你可以使用promises,条件很简单:

function delay(t) {
    return new Promise(resolve => setTimeout(resolve, t));
}

async function example() {
    if (!isFlyoutAnimationDisabled)
        await delay(250);
    flyOut();
}
// or without async/await:
function example() {
    return (isFlyoutAnimationDisabled
      ? Promise.resolve()
      : delay(250)
    ).then(flyOut);
}

答案 1 :(得分:1)

超级可读

if (isFlyoutAnimationDisabled) {
  flyOut();
} else {
  setTimeout(flyOut, 250);
}

使用三元运算符?:

可读性较差
setTimeout(flyOut, isFlyoutAnimationDisabled ? 0 : 250);

但使用上述内容时,您应该考虑将setTimeout(fn, 0)作为“nextTick”执行,以显示这种看似意外的结果

fn = () => console.log("A");

setTimeout(fn, 0) // "A"
console.log("B"); // "B"

// See console! 

答案 2 :(得分:1)

使用三元运算符,例如:

isFlyoutAnimationDisabled ? flyOut() : setTimeout(flyOut, 250);

答案 3 :(得分:1)

async function foo() {
  const delay = isFlyoutAnimationDisabled ? 0 : 250;
  await new Promise(x => setTimeout(x, delay));
  flyOut();
}

字面上不需要if-else。此处使用Promise,并避免concurrency问题。灵感来自@ Bergi的答案。