Array.every() – 返回可能的callback?

我正在parsinginput文件,并使用Array.every函数运行每个元素。 根据结构,需要手动input用户。 所以如果你有这样的例子:

configData.users.every(function(user){ if(user.enabled == 1){ if(user.mobile == 1){ prompt.start(); prompt.get(['mCode'], function (err, result) { //Do something... //return needed here! }); }else{ //Do something else... return true; } } }); 

所以在我的情况下,提示是在input用户input时调用callback函数。在这一点清除,下一个元素可以处理。 那么我现在怎么调用return来继续every()函数呢?

感谢您的帮助。

你不能同步执行asynchronous的事情,这本质上就是你正在做的事情。 正如评论中所言,承诺是最好的select。 如果你想直接写,最简单的方法是:

 function handle_users(users) { var i = 0; function _internal() { if (i >= users.length) return; var user = users[i]; if (user.enabled == 1) { if (user.mobile == 1) { prompt.start(); prompt.get(['mCode'], function (err, result) { //Do something... //return needed here! i++; _internal(); }); } else { i++; _internal(); return true; } } internal(); } 

我们定义了一个内部函数,我们在prompt.get的callback函数内以一种recursion的方式调用。

如果您想获取所有用户已经validation的信息或input了正确的关键字或任何信息,那么在顶层保留一个布尔variables,在出现故障时将其设置为false,然后从函数的返回位置回报。 或者,如果您想在第一次失败时停止处理,可以像在every一样,在_internal顶部_internal并立即返回。

那么,我很确定我的答案 – 如果其他问题的链接没有帮助 – 我会适应你的具体问题(我使用“什么时候”,你可以使用你的首选承诺包):

 configData.users.reduce(function(lastValue, user){ return lastValue.then(function(u) { if (user.enabled == 1) { if (user.mobile == 1) { prompt.start(); return when.promise(function(resolve, reject) { prompt.get(['mCode'], function (err, result) { //Do something... //return needed here! resolve(u); }); }); } else { //Do something else... return when.resolve(u); } } }); }, when.resolve(configData.users[0])); 

减less不仅是总和条目,关于它的事情是你可以使用你在函数中获得的最后一个值(对于最后一个数组条目来说属于最后一个数组条目)作为下一个值。 我声称这就是你需要的,因为你想要返回一个承诺(为了等待事情发生在你的callback)。

我testing了它,它的工作原理是我明白你需要它的工作,希望我没有错过你的意图在这个问题上。 现在,代码会遍历第一个用户两次,您应该切片数组或其他东西,使其完全按照您的意愿工作。

注意现在你在user.enabled == 0上什么也没有返回,你可能想要添加另一个else来继续reducestream。