[英]Return a value from a Javascript closure function?
我在Javascript中從閉包函數返回值時遇到問題。 最初我在內部函數中有一個return語句,但這似乎不起作用。 我將return語句移動到外部函數,它仍然返回undefined。 在外部函數返回之前,不應該在內部函數中給returnVal賦值嗎?
console.log('Returned: ' + getColumn('CPC'));
function getColumn(header) {
var returnVal = undefined;
ptor.findElements(protractor.By.className('ngHeaderText')).then(function(headers) {
for (var i = 0; i < headers.length; i++) {
(function(i){
headers[i].getText().then(function(headerResult) {
if (headerResult == header) {
console.log('i: ' + i);
returnVal = i;
}
});
})(i);
}
});
return returnVal;
};
任何幫助將不勝感激!
編輯:移動了返回語句
您不能在Javascript中執行“非本地返回”,其中內部函數返回外部函數。
也就是說,你的問題不在於閉包,而是你需要使用promises來編寫控制流。 如果Javascript發出異步請求(如果你做一個yield語句就像C#或Python那樣),Javascript不會“暫停”當前函數,而只是保持卡車運輸。 這意味着您正在調用代碼來啟動異步請求,但在請求完成之前繼續並返回undefined。 您想要做的是立即返回一個promise(而不是返回undefined)並使用promise特定方法在promise事件處理程序中執行所有控制流。 (有點糟糕,你不能像往常一樣使用return
和for
循環,但這是一個Javascript wart,你將不得不忍受,直到每個人都開始使用ES6生成器)
首先, getColumn
應返回包含列值的promise。 現在,它做了一些計算,但沒有返回任何東西:
function getColumn(header){
return ptro.findElements(...);
// ^^^^^
}
其次,你通常不能把異步代碼放在這樣的循環中。 首先,您需要選擇是否要按順序執行請求(獲取第一個標頭,完成第二個標頭時等),或者如果要激活所有標頭請求一次並等待結果。 這些必須以不同的方式編碼,你如何編寫它們將取決於你是否必須手工編碼所有東西以及你正在使用什么幫助lib來實現承諾。
例如,如果要按順序執行處理,一種方法是使用遞歸而不是for循環。
then(function(headers) {
function loop(i){
if( i >= headers.length) {
return null; //not found
}else{
return headers[i].getText().then(function(headerResult) {
if (headerResult == header) {
console.log('i: ' + i);
return i;
}else{
return loop(i+1);
}
});
}
}
return loop(0);
});
並行觸發請求的代碼會略有不同,具體取決於您使用的promise庫。 希望你應該有一些庫函數來做到這一點。
你的邏輯是正確的,你可以從內部函數返回一個值到外部函數,然后從外部函數返回該值。 從您的代碼派生的這個簡化示例顯示了這一點:
console.log('Returned: ' + getColumn());
function getColumn() {
var returnVal = undefined;
(function(){
returnVal = 'test';
})();
return returnVal;
};
這會在控制台中產生以下消息:
退回:測試
問題是你從傳遞給when()的函數返回,而不是從它本身所在的函數返回
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.