Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 同步forEach循环(等待它结束)_Javascript_Node.js_Foreach_Synchronous - Fatal编程技术网

Javascript 同步forEach循环(等待它结束)

Javascript 同步forEach循环(等待它结束),javascript,node.js,foreach,synchronous,Javascript,Node.js,Foreach,Synchronous,我在Node.js中有一个函数,它接收一个数组并在其中循环,对每个元素进行一些耗时的计算 下面是该函数的超级简化版本: var analyze_data = function (data) { data.forEach(function (elm) { if (elm.myProp == true) { return true; } }); return false; } 本质上,如果元素的任何属性myProp等于

我在Node.js中有一个函数,它接收一个数组并在其中循环,对每个元素进行一些耗时的计算

下面是该函数的超级简化版本:

var analyze_data = function (data) {
    data.forEach(function (elm) {
        if (elm.myProp == true) {
            return true;
        }
    });
    return false;
}
本质上,如果元素的任何属性
myProp
等于true,我希望函数返回true。如果没有任何元素满足此条件,则函数应返回false

但是,代码从不等待forEach循环完成。换句话说,如果数组中的第100个元素满足条件,则函数应返回true。相反,它跳到
返回false
并在
forEach
循环有时间完成之前返回false

有解决办法吗

编辑 所以我意识到我的问题过于简单了-我实际上使用了,我的代码看起来更像这样:

var analyze_data = function (data) {
    return new Promise(function (resolve, reject) {
        data.forEach(function (elm) {
            if (elm.myProp == true) {
                resolve(elm);
            }
        });
        resolve(false);
    });
}
所以在现实中,我没有在forEach函数而不是外部函数中返回值的问题。此外,请注意函数如何解析为元素本身,而不是true,否则为false。如果其中一个元素通过了条件,我实际上想返回一些相关数据,否则返回false表示它们都失败了


现在有什么想法吗p同样,感谢所有的原始答案

问题在于,您正在从内部函数返回true的值,但没有在外部函数中捕获它。如果您这样做,它应该可以工作:

var retVal = false;
data.forEach(function (elm) {
    if (elm.myProp == true) {
        retVal = true;
    }
});
return retVal;
现在您有两个功能:

var analyze_data = ***function (data)*** {
  data.forEach(***function (elm)*** {
    if (elm.myProp == true) {
        return true; //returns out of function(elm)
    }
  });
  //the true value is gone - you didn't do anything with it
  return false; //always returns false out of function(data)
}
编辑:

您现在(可能)正在解析为
elm
,但之后总是解析为
false
。我不能百分之百确定这个行为,但我猜后面的行为会覆盖第一个行为。因此,您需要再次检查:

is_found = false;
data.forEach(function (elm) {
    if (elm.myProp == true) {
        resolve(elm);
        is_found = true;
    }
});
if (!is_found) {
    resolve(false);
}
当然,看起来你应该这样做:

if (!is_found) {
   reject(false);
}
那么你可以做:

promise.then(function(result) {
    // do stuff since it found stuff :)
}, function(err) {
    // do stuff since if didn't find anything :(
});

您的问题不是forEach是异步的,因为它不是。但是因为你把一个报税表错当成了另一个报税表

您从回调返回
true
,而不是从主函数返回

前程调用FURACH,因为它对数组中的每个元素执行,不能在中间停止。以下是摘录自:

注意:无法停止或中断forEach循环。解决办法是 使用Array.every或Array.some


这不是同步/异步执行的问题。您所做的是在for each回调中返回true(这对于
analyze\u data
函数是不可见的),然后在forEach完成后返回false

您需要使用:


例如,如果您切换到Promissions,您可以使用
Q.all
。您只需在错误的位置返回真值,尝试使用
Array.prototype。据我所知,有些
,问题在于这些函数是异步的。文章中的代码只是一个例子。可能是,我的理解是,他认为这就是问题所在,但考虑到这个例子,似乎更可能是没有捕获回报value@dave如果你看一下我刚做的编辑,函数似乎只是返回false,而没有等待forEach循环完成迭代
promise.then(function(result) {
    // do stuff since it found stuff :)
}, function(err) {
    // do stuff since if didn't find anything :(
});
var analyze_data = function (data) {
    return data.some(function (elm) {
        return elm.myProp == true;
    });
}