2013-11-04 119 views
1

我試圖用函數的結果更新變量,因此它可以在別處被引用,但它不會更新。無法更新函數內的變量

var total = 0; 

mainQuery.count({ 
    success: function (number) { 
     console.log("results",number); 
     total = number; 
    } 
}); 

console.log("total is",total); 

// console output: 
// results 164 
// total is 0 

這樣做的正確方法是什麼?

+5

這看起來像一個異步回調函數的console.log("total is",total);輸出可能被渲染? – Blazemonger

+0

是的,看起來像異步回調,你需要在成功回調函數內做你的工作。 –

回答

4

據我所看到的,你mainQuery.count()功能是異步的,一旦結束運行運行success回調。但是,您在註冊表回調後調用console.log(),但在成功函數結束後才能運行。你應該做的是成功後的回調運行console.log()

var total = 0; 

mainQuery.count({ 
    success: function (number) { 
     console.log("results",number); 
     total = number; 
     myFn(); 
    } 
}); 

function myFn() { 
    console.log("total is",total); 
} 
+0

爲了增加說明,這裏有一個很好的例子,我最近看了:呼叫到'計數()'是喜歡把一些雞蛋煮。 「成功」處理程序就像一個警報,當他們完成烹飪切片時。如果你在鬧鈴響起之前嘗試使用雞蛋,你會得到一個非常混亂的三明治! –

1

此代碼應該以這種方式工作。 結帳「關閉」這就是你在做什麼。簡而言之,意味着你正在訪問另一個上下文中的變量。

這基本上是同樣的事情:

<script> 
var test = 0; 
setTimeout(function() { test = 10; }, 1000); 
</script> 

和它的作品。 ^^

你的問題可能是,你正在訪問的變量,你的異步函數返回

+0

謝謝。讀一下這個。 – cavill

1

之前不知道的變量total的總體範圍,這是很難回答的,但覆蓋你可以做所有基地這...

window.total = 0; 

mainQuery.count({ 
    success: function (number) { 
     console.log("results",number); 
     window.total = number; 
    } 
}); 

console.log("total is", window.total); 
1
var total = 0; 

mainQuery.count({ 
    success: function (number) { 
     console.log("results",number); 
     total = number; 
     console.log("total is",total); 
    } 
}); 

//The code you had here is executed before the async-call is done. So it hasnt updated total with the value yet. 

// console output: 
// results 164 
// total is 0 
3

正如@Blazemonger說,success可能是一個異步函數。之前的成功甚至分配total