Array.every() - 回调可能吗?

时间:2015-12-12 10:17:18

标签: javascript arrays node.js

我正在解析输入文件并使用Array.every函数遍历每个元素。根据结构,需要用户的手动输入。 所以,如果你有这样的事情:

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;
    }
 }
});

因此,在我的情况下,当输入用户的输入时,提示符正在调用回调函数。此时清除并且可以处理下一个元素。那么如何在此时调用return来继续every()函数?

谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

您无法同步执行异步操作,这实际上就是您要执行的操作。正如评论中所提到的,承诺是最好的方式。如果你想直接写它,最简单的方法是:

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的回调中以一种递归方式调用。

如果您想获取所有用户都有资格或输入正确关键字或其他任何关键字的信息,请在顶层保留一个布尔变量,在出现故障时将其设置为false,然后从函数返回的位置。或者如果你想在第一次失败时停止处理,就像every那样,你可以在_internal的顶部检查它并立即返回。

答案 1 :(得分:1)

嗯,我非常肯定我的答案 - 如果指向其他问题的链接没有帮助 - 我会根据您的具体问题进行调整(我使用'何时&# 39;,您可以使用您首选的承诺包):

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]));

reduce不仅仅是对条目进行求和,关于它的事情是你可以使用函数中的最后一个值(对于最后一个数组条目属于某个问题)来获取下一个值。 我声称你需要的是因为你想要回复一个承诺(为了等待你的回调中发生的事情)。

我对它进行了测试,它起作用,因为我知道你需要它才能工作,希望我在这个问题上没有错过你的意图。 现在,代码将遍历第一个用户两次,您应该对数组进行切片或使其完全按照您的意愿工作。

请注意,现在您在user.enabled == 0上没有返回任何内容,您可能希望添加其他内容以继续缩小流程。