2015-08-16 45 views
4

我试图在异步API的循环内执行多个调用,直到返回我想要的值(在此例中为true)。问题是我不希望在找到该值后继续循环,并且我不想在循环之后执行循环,而没有从它返回的值...但是到目前为止,我无法实现这个工作。我认为我在这里做错了什么,但是“我无法弄清楚整个情况”。在循环内进行异步调用,直到找到值

function isSelected(element, callback) { 
    // This is a little bit confusing for me...can I just get the value from 
    // getDataAsync without using isSelected function? 
    Office.select(element).getDataAsync(function (asyncResult) { 
    var result = true; 

    // some logic here that may change 'result' 
    callback(result); 
    }); 
} 

function delete(elements) { 
    var index = -1; 

    for (var i = 0, (i < elements.length) && (index < 0); i++) { 
    isSelected(elements[i], function(result) { 
     if (result) { index = i; }; // ...and I don't want to keep "looping" 
    }); 
    } 
    // I want to execute these lines after the for-loop is done 
    // ...do something with the "correct" index value 
} 
+0

为什么不选择“接受答案”缺少一些东西? – Aminadav

+0

@Amina这里有个条件:'if(result){index = i; }'...之后,我不能再执行了,否则我可能会得到更多'真正'的值 –

回答

1

您试过Kriskowal's Q?有一个很好的函数调用Q#allSettled

Q.allSettled(promises) 
.then(function (results) { 
    results.forEach(function (result) { 
     if (result.state === "fulfilled") { 
      var value = result.value; 
     } else { 
      var reason = result.reason; 
     } 
    }); 
}); 

所以基本上这是它如何工作你的情况:

var promises = []; 

for(/* conditions */) { 
    promises.push(/* async call which returns a promise */); 
} 

Q.allSettled(promises).then(function(results) { 
    results.forEach(function (result) { 
     var value; 

     if (result.state === "fulfilled") { 
      value = result.value; 

      // do something with "value" 
     } 
    }); 
}); 

allSettled只是确保了then将照常的承诺是否是执行是否成功,您可以检查从异步调用中检索到的对象的值。

1

我推荐三种方式来做到这一点。

  • 仅使用JavaScript。
  • 使用异步库。
  • 使用下划线库。

在这里你可以看到JavaScript实现:

你可以做这样的事情: 您需要跟踪回家很多次,你调用函数,多少次回调发生

function delete(elements) { 
    var index = -1; 

    var stack=0; 
    for (var i = 0, (i < elements.length) && (index < 0); i++) { 
    stack++   // Go up on each loop 
    isSelected(elements[i], function() { 
     stack--;  //Go down each callback 
     index = i; 
     if(stack==0) afterAllFinish() //When it return to 0 mean all callback have finished 
    }); 
    } 

    function afterAllFinish(){ 
    // I want to execute these lines after the for-loop is done 
    // ...do something with the "correct" index value 
    } 
} 

使用其他库:

  1. 请看一看http://underscorejs.org/#after为下划线的方式来解决它。

  2. 请看https://github.com/caolan/async#parallel看看异步方式来解决它。