Javascript 跟踪异步调用

Javascript 跟踪异步调用,javascript,Javascript,我正在开发一个Mozilla扩展,遇到了一个问题,我对一个异步函数进行了n次调用,该函数超出了我的控制,它在完成时执行回调。在这个回调中,如果是第n次&最后一次回调,我需要采取一个特殊的操作。我不知道如何确定回调是否是最后一个回调,我考虑设置一个计数器并每次递减,但由于嵌套循环,我不知道将进行多少异步调用(如果不事先计算出来,这将是低效的)。有没有什么好办法 function dataCallBack(mHdr, mimeData) { // ... Do stuff ... /

我正在开发一个Mozilla扩展,遇到了一个问题,我对一个异步函数进行了n次调用,该函数超出了我的控制,它在完成时执行回调。在这个回调中,如果是第n次&最后一次回调,我需要采取一个特殊的操作。我不知道如何确定回调是否是最后一个回调,我考虑设置一个计数器并每次递减,但由于嵌套循环,我不知道将进行多少异步调用(如果不事先计算出来,这将是低效的)。有没有什么好办法

function dataCallBack(mHdr, mimeData)
{
    // ... Do stuff ...
    // Was this the final callback? 
}

function getData() {
    var secSize = secList.length;

    for (var i = 0; i < secSize; i++) {
        if (secList[i].shares.length >= secList[i].t) {

        var hdrCount = secList[i].hdrArray.length;

        for(var j = 0; j < hdrCount; j++)
        {
                    // MAKE ASYNC CALL HERE
            mozillaFunction(secList[i].hdrArray[j], this, dataCallBack);
        }
        }
    }

}
函数数据回调(mHdr、mimeData)
{
//…做事。。。
//这是最后一次回调吗?
}
函数getData(){
var secSize=secList.length;
对于(变量i=0;i=secList[i].t){
var hdrCount=secList[i].hdrArray.length;
对于(var j=0;j

谢谢。

您可以按照以下思路做一些事情:

   var requestsWaiting = 0;
   // this will be the function to create a callback
   function makeDataCallback() {
     requestsWaiting++; // increase count
     // return our callback:
     return function dataCallBack(mHdr, mimeData)
     {
       // ... Do stuff ...
       // per request - make sure that this happens in the next event loop:
       // can be commented out if not needed.
       setTimeout(function() {
         // Was this the final callback? 
         if (! --requestsWaiting) {
            // it was the final callback!
         }
       // can be commented out if not needed
       },0);
     }
   }

// then in your loop:
// MAKE ASYNC CALL HERE
mozillaFunction(secList[i].hdrArray[j], this, makeDataCallBack());

非常感谢。这看起来不错,但是否有可能在循环的下一次迭代之前执行回调?i、 e创建回调->执行回调->是最终的,在进行下一个循环迭代之前。或者可以保证在循环中的最后一次函数调用之前,requestsWaiting将保持>0?@Jason Gooner-是的,您实际上可以将if包装在
setTimeout(function(){
..
},0)中
要解决此问题,将在不在手机上时编辑:)