我有一个与回调和超时相关的JavaScript问题。
这是我写的示例代码段:
var f1 = function(){
var result;
window.setTimeout(
function(){
console.log("timeout in 100ms");
result = 10;
}.bind(this), 100);
return result;
};
所以,我希望函数修改变量结果。我使用.bind(this)来确保它知道它的结果。
但是,当我运行f1()时输出是9而不是10,这是我所希望的。
任何线索?
答案 0 :(得分:4)
结果是一个数字。因此,它返回值9
而不是对象的引用。
bind
在您的方案中没有任何有用的效果。 bind
更改了函数上下文(this
)。
返回包含值10的对象将起作用。
var f1 = function(){
var result = { value: 9 };
window.setTimeout(
function(){
console.log("timeout in 100ms");
result.value = 10;}.bind(this), 100);
return result;
};
您的问题可能有更好的解决方案。
<强>回调:强>
var f1 = function(valueCallback){
var result;
window.setTimeout(function(){
console.log("timeout in 100ms");
result = 10;
valueCallback(result);
};
这样的功能会像这样使用:
f1(function(value)) {
console.log(value); // Will print 10 after 100ms.
})
另一种选择,可以使用Promises:
var f1 = function() {
return new Promise(function(resolve, reject) {
window.setTimeout(resolve.bind(null, 10), 100);
}
}
你可以这样称呼这样的函数:
f1().then(function(value) {
console.log(value); // Will print 10 after 100ms.
});
答案 1 :(得分:0)
您正在调用超时以在函数已返回后修改该值,因此它返回结果的默认值,然后调用超时,并且因为该值的范围受限于函数,您无法返回它经过修改后。
你能做的就是这个
var result = 9;
var f1 = function(){
window.setTimeout(
function(){
console.log("timeout in 100ms");
result = 10;}.bind(this), 100);
return result;};
然后在调用f1后t将返回9然后调用result
并显示10