2014-07-24 180 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); 

後發生超時就知道做或不該