Node.js:在继续之前等待循环中的回调

时间:2022-06-08 20:53:37

I have a loop that has an asynchronous call inside it, with a callback. To be able to move on, I need the callback to fire for the entire loop all the way through, to then display the results of the loop.

我有一个循环,里面有一个异步调用,带有一个回调。为了能够继续前进,我需要回调一直触发整个循环,然后显示循环的结果。

Every way I've tried to control this doesn't work (have tried Step, Tame.js, async.js, and others) - any suggestions on how to move forward?

我试图控制它的每一种方式都不起作用(尝试过Step,Tame.js,async.js等) - 有关如何前进的任何建议吗?

array = ['test', 'of', 'file'];
array2 = ['another', 'array'];

for(i in array) {
    item = array[i];
    document_ids = new Array();

    for (i2 in array2) {
        item2 = array2[i2];
        // look it up
        mongodb.find({item_name: item2}).toArray(function(err, documents {
            // because of async,
            // the code moves on and calls this back later
            console.log('got id');
            document_ids.push(document_id);
        }))
    }

    // use document_ids
    console.log(document_ids); // shows []
    console.log('done');
}

// shows:
// []
// done
// got id
// got id

1 个解决方案

#1


10  

You're logging document_ids before your callbacks fire. You have to keep track of how many callbacks you've run to know when you're done.

您在回调激活之前记录了document_ids。您必须跟踪在完成后您已知道的回调次数。

An easy method is to use a counter, and to check the count on each callback.

一种简单的方法是使用计数器,并检查每个回调的计数。

Taking your example

举个例子

var array = ['test', 'of', 'file'];
var array2 = ['another', 'array'];
var document_ids = [];

var waiting = 0;

for(i in array) {
    item = array[i];

    for (i2 in array2) {
        item2 = array2[i2];
        waiting ++;

        mongodb.find({item_name: item2}).toArray(
            function(err, document_id) {
                waiting --;
                document_ids.push(document_id);
                complete();
            })
        );
    }
}

function complete() {
    if (!waiting) {
        console.log(document_ids);
        console.log('done');    
    }
}

#1


10  

You're logging document_ids before your callbacks fire. You have to keep track of how many callbacks you've run to know when you're done.

您在回调激活之前记录了document_ids。您必须跟踪在完成后您已知道的回调次数。

An easy method is to use a counter, and to check the count on each callback.

一种简单的方法是使用计数器,并检查每个回调的计数。

Taking your example

举个例子

var array = ['test', 'of', 'file'];
var array2 = ['another', 'array'];
var document_ids = [];

var waiting = 0;

for(i in array) {
    item = array[i];

    for (i2 in array2) {
        item2 = array2[i2];
        waiting ++;

        mongodb.find({item_name: item2}).toArray(
            function(err, document_id) {
                waiting --;
                document_ids.push(document_id);
                complete();
            })
        );
    }
}

function complete() {
    if (!waiting) {
        console.log(document_ids);
        console.log('done');    
    }
}