假设我们有一个脚本,它将为数组中的每一行执行某个任务。
if (left < index) {
quickSort(arr, left, index);
}
if (index + 1 < right) {
quickSort(arr, index + 1, right);
}
问题:
答案 0 :(得分:2)
您可以执行以下操作来迭代您的数组:
var myarray = [1,2,3,4,5];
next(myarray, 0);
function next(array, idx) {
if (idx !== array.length) {
// do something
console.log(array[idx]);
// run other functions with callback
another_fct(array[idx], function() {
next(array, idx + 1); // then the next loop
});
// or run directly the next loop
next(array, idx + 1);
} else {
// the entire array has been proceed
console.log('an array of '+array.length+' number of elements have been proceed');
}
}
function another_fct(array_element, callback) {
// do something with array_element
console.log('value : '+array_element);
callback(); // run the next loop after processing
}
此方法将同步执行数组元素。
答案 1 :(得分:1)
试试这个:
function execute(err, array) {
loop(array, function(err, object, next) {
console.log(object);
next(); // this will call recur inside loop function
}, function() {
console.log('All done');
});
}
function loop(array, callback, finish) {
var copy = array.slice();
(function recur() {
var item = copy.shift();
if (item) {
callback(null, item, recur);
} else {
if (typeof finish == 'function') {
finish();
}
}
})();
}
不,您的函数不是异步的,而是使用setTimeout异步调用它。
答案 2 :(得分:0)
async为此提供了async.series和其他帮助程序。
答案 3 :(得分:0)
如果您重构代码并删除任何冗余的匿名函数,您可以更好地包围它。例如,将匿名函数作为参数传递给另一个函数尚未使函数异步。您在"Does taking a callback make a function asynchronous?"中阅读了更深入的解释。
从重构版本
setTimeout(function() {
[1, 2, 3, 4, 5].forEach(function(object) {
console.log(object)
//do a certain task when it's...
});
}, 6000);
可以看出,为数组调用了forEach
。 forEach
方法每个数组元素执行一次提供的函数并同步执行。
所以,回答你的问题:
setTimeout
)但是,如果您选择在forEach
函数中启动异步操作,则情况会发生很大变化。结果是所有操作都在同一时间进行。这可能是资源方面的危险操作。有像async这样的库可以优雅地处理这个用例。
(顺便说一句,好好利用Node.js errbacks,其中第一个函数参数保留用于传递潜在错误。)