gpt4 book ai didi

javascript - 使用带有参数回调的数组的 Node 异步 waterfall

转载 作者:行者123 更新时间:2023-11-30 17:42:38 25 4
gpt4 key购买 nike

我收到一个我不明白的错误。我用一组函数调用 async.waterfall。为清楚起见,该函数已“缩短”。

FabricCommand.prototype.do = function (callback, undoArray) {
var self = this;

if (undoArray === undefined) {
undoArray = [];
}

undoArray.push(self);
callback(null, undoArray);
};

我创建的数组如下所示:doCommands 是一个数组,对象是这样添加的:

doCommands.push(fabricCommand.do.bind(fabricCommand));

waterfall 设置:

async.waterfall(
doCommands,
function(err, undoCommands){
if (err) {
// do something ...
}
else {
console.log('we succeeded with all the do commands... and there are '
+ undoCommands.length
+ ' in the undoCommands but we will disregard it...');
}
}
);

现在,当我运行这段代码时,第一次通过 FabricCommand.do 函数,我分配了 undoCommands 数组并向其中添加一个,下次通过我尝试添加数组元素时,出现以下错误:

undoArray.push(something);
^ TypeError: Object function (err) {
if (err) {
callback.apply(null, arguments);
callback = function () {};
}
else {
var args = Array.prototype.slice.call(arguments, 1);
var next = iterator.next();
if (next) {
args.push(wrapIterator(next));
}
else {
args.push(callback);
}
async.setImmediate(function () {
iterator.apply(null, args);
});
}
} has no method 'push'

谁能看出我做错了什么?

最佳答案

async.waterfall 执行的函数必须具有以下签名:

function(arg, callback) { … }

或者,有多个参数:

function(arg1, arg2, callback) { … }

在您的情况下,您只需反转两个参数:

 FabricCommand.prototype.do = function (callback, undoArray) { … }

callback 收到了要存储在 undoArray 中的值,undoArray 收到了要用于 callback 的值>,即一个函数:这就是您遇到这个奇怪错误的原因(function […] has no method 'push')。

您需要按正确的顺序放置参数:

 FabricCommand.prototype.do = function (undoArray, callback) { … }

第二个问题是 waterfall 的第一个函数只接收一个参数:回调(因为没有要接收的值,因为它是 waterfall 的第一个函数)。一种解决方案是检查参数的数量:

if (Array.prototype.slice.apply(arguments).length === 1) {
callback = undoArray;
undoArray = undefined;
}

这是一个working gist .

关于javascript - 使用带有参数回调的数组的 Node 异步 waterfall ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20749359/

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