2014-07-24 152 views
17

我只想从setTimeout获取返回值,但我得到的是函数的整个文本格式?从setTimeout获取返回值

function x() { 
    setTimeout(y = function() { 
     return 'done'; 
    }, 1000); 
    return y; 
} 

console.log(x()); 
+0

你的语法是这样的,它只会返回功能,您可以访问变量y。 – Mritunjay

+0

你想“完成”被退回吗?你如何返回函数的结果,这将在1000毫秒后被调用? –

+0

超时是异步的,所以你不能从它们返回。 (好吧,你可以,但返回值是无处可去的) – Ferdi265

回答

29

您需要为此使用Promises。他们是available in ES6,但可以polyfilled quite easily

function x() { 
    var promise = new Promise(function(resolve, reject) { 
    window.setTimeout(function() { 
     resolve('done!'); 
    }); 
    }); 
    return promise; 
} 

x().then(function(done) { 
    console.log(done); // --> 'done!' 
}); 
+0

实际上,在我的示例中'done'是一个承诺,需要在setTimeout内部返回。因为我无法获取setTimeout中返回的deferred.resolve()。它会怎样?谢谢 – Vainglory07

+1

你可以在问题中发布一个更清晰的代码示例吗? –

4

您无法从传递给setTimeout的函数中获得返回值。

在您传递给setTimeout的函数被调用之前,调用setTimeout(在您的示例中为x)的函数将完成执行并返回。

无论你想要用你得到的价值来做什么,你都需要从你传递给setTimeout的函数中去做。

在你的榜样,将被写成:

function x() { 
    setTimeout(function() { 
     console.log("done"); 
    }, 1000); 
} 

x(); 
+0

可爱和准确的解释! –

1

更好地采取一个回调函数x和任何任务你想要的超时后执行发送该回调。

function x (callback) { 
    setTimeout(function() { 
     callback("done"); 
    }, 1000); 
} 

x(console.log.bind(console)); //this is special case of console.log 
x(alert) 
0

我想你想有标志,以了解事件发生或没有。 setTimeout不会返回一个值。你可以使用一个变量来检测事件发生或没有

var y="notdone"; 
    setTimeout(function() { 
     y="done"; 
    }, 1000); 

后发生超时就知道做或不该