gpt4 book ai didi

javascript - 如何在 Node.js 中跳过 "async.forEachOf"循环迭代

转载 作者:行者123 更新时间:2023-12-02 15:51:31 25 4
gpt4 key购买 nike

一个async.waterfall嵌套在 async.forEachOfLimit 内循环如下面的代码所示。

问题:当代码在 async.waterfall 内执行步骤时,如何跳过 async.forEachLimit 的迭代?换句话说,突破 async.waterfall 并返回 async.forEachLimit。我已经在代码中注释了应该进行此检查的位置

当前代码给出错误回调已被调用。

此外,当我想突破 async.waterfall 时,如果我使用 return callback() 代替 cb() ,没有发生错误,但没有跳过。

var async = require('async')
var users = ['a','b','c']

async.forEachOfLimit(users, 1, function(user, index, cb) {

console.log(index + ': ' + user)

async.waterfall([
function(callback) {
callback(null);
},
function(callback) {
// Skip async.forEAchOfLimit iteration when index == 1
if(index == 1)
cb()

callback(null);
}
], function (err, result) {
console.log(index + ": done")
cb()
});

}, function() {
console.log('ALL done')
})

错误

0: a
0: done
1: b
2: c
1: done

/Users/x/test/node_modules/async/lib/async.js:43
if (fn === null) throw new Error("Callback was already called.");
^
Error: Callback was already called.

所需输出

0: a
0: done
1: b
2: c
2: done
ALL done
<小时/>

使用返回回调()

var async = require('async')
var users = ['a','b','c']

async.forEachOfLimit(users, 1, function(user, index, cb) {

console.log(index + ': ' + user)

async.waterfall([
function(callback) {
callback(null);
},
function(callback) {
// Skip async.forEAchOfLimit iteration when index == 1
if(index == 1)
return callback()

callback(null);
}
], function (err, result) {
console.log(index + ": done")
cb()
});

}, function() {
console.log('ALL done')
})

输出

没有爆发...

0: a
0: done
1: b
1: done
2: c
2: done
ALL done

最佳答案

在您的第一个解决方案中,当索引匹配 1 时,cb 被调用两次,这就是为什么您不断收到 Callback was said 错误。尽管您调用了 forEachOfLimit 回调 cb,但您的代码不会停止执行并调用回调。在回调函数中,cb 又被执行一次。

var async = require('async')
var users = ['a','b','c']

async.forEachOfLimit(users, 1, function(user, index, cb) {

console.log(index + ': ' + user)

async.waterfall([
function(callback) {
callback(null);
},
function(callback) {
// Skip async.forEAchOfLimit iteration when index == 1
if(index == 1)
cb() // First callback call

callback(null);
}
], function (err, result) {
console.log(index + ": done")
cb() // Second callback call
});

}, function() {
console.log('ALL done')
})

在第二个解决方案中,如果索引匹配 1,它将调用不带参数的回调,并跳过使用空参数调用回调。仍然没有突破 waterfall 。

要使用 waterfall 解决您的问题,您有两种选择。

  1. 使用错误参数调用 waterfall 的方法回调,该方法会脱离 waterfall 并在 waterfall 的回调中处理此错误。

    var async = require('async')
    var users = ['a','b','c']

    async.forEachOfLimit(users, 1, function(user, index, cb) {

    console.log(index + ': ' + user)

    async.waterfall([
    function(callback) {
    callback(null);
    },
    function(callback) {
    // Skip async.forEAchOfLimit iteration when index == 1
    if(index == 1)
    return callback(new Error('Index equals 1'));

    callback(null);
    }
    ], function (err, result) {
    console.log(index + ": done")

    if(err.message == 'Index equals 1') {
    err = null; // If you want to continue executing forEachOfLimit no error must be passed to cb
    }

    cb(err, result);
    });

    }, function() {
    console.log('ALL done')
    });
  2. 在每个 waterfall 式方法的开头,跳过其余代码并立即调用回调(这是您在第二次尝试中所做的)

    var async = require('async')
    var users = ['a','b','c']

    async.forEachOfLimit(users, 1, function(user, index, cb) {

    console.log(index + ': ' + user)

    async.waterfall([
    function(callback) {
    callback(null);
    },
    function(callback) {
    // Skip execution of the rest of waterfall method immediately
    if(index == 1)
    return callback()

    // Some additional code here

    callback(null);
    }
    ], function (err, result) {
    console.log(index + ": done")
    cb()
    });

    }, function() {
    console.log('ALL done')
    })

关于javascript - 如何在 Node.js 中跳过 "async.forEachOf"循环迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31815917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com