gpt4 book ai didi

javascript - 从 Javascript 闭包函数返回一个值?

转载 作者:行者123 更新时间:2023-12-02 17:33:50 25 4
gpt4 key购买 nike

我在从 Javascript 中的闭包函数返回值时遇到问题。最初我在内部函数中有一个 return 语句,但这似乎不起作用。我将 return 语句移至外部函数,但它仍然返回未定义。 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;
};

任何帮助将不胜感激!

编辑:移动了 return 语句

最佳答案

您无法在 Javascript 中执行“非本地返回”,即内部函数返回外部函数。

也就是说,你的问题不是闭包,而是你需要使用 promise 来编写控制流。如果 JavaScript 发出异步请求,则它不会“暂停”当前函数(就像 C# 或 Python 中的yield 语句一样),而是继续运行。这意味着您正在调用代码来启动异步请求,但在请求完成之前继续并返回未定义。您想要做的是立即返回一个 promise (而不是返回未定义),并使用特定于 promise 的方法在 promise 事件处理程序中执行所有控制流。 (这有点糟糕,你不能像往常一样使用 returnfor 循环,但这是一个 Javascript 问题,你必须忍受,直到每个人都开始使用 ES6 生成器)

首先,getColumn 应该返回一个包含列值的 Promise。现在,它执行一些计算,但不返回任何内容:

function getColumn(header){
return ptro.findElements(...);
// ^^^^^
}

其次,您通常不能只是将异步代码放入这样的循环中。首先,您需要选择是否要按顺序执行请求(获取第一个 header ,完成后获取第二个 header 等),或者是否要一次性触发所有 header 请求并等待结果。这些必须以不同的方式进行编码,并且如何编写它们将取决于您是否必须手动对所有内容进行编码以及您用于 promise 的帮助程序库。

例如,如果您想按顺序进行处理,一种方法是使用递归而不是 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 库。希望您应该有某种库函数来执行此操作。

关于javascript - 从 Javascript 闭包函数返回一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22821166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com