async.timesLimit() 将不接受有效的回调函数
async.timesLimit() will not accept a valid callback function
问题
我正在 API 使用节点的异步库。我遇到了似乎无法绕过的障碍。
我正在通过 RESTful API 修改数据库中的对象。我正在使用的命令称为 ModifyObject
并且有效。我正在制作另一个功能,允许我一次异步编辑多个对象。但是,我不想一次用 100 个请求访问我的服务器,所以我使用 async.timesLimit()
。你可以找到 the documentation for this function here。这是我的 shared.js
实用函数文件:
var async = require('async');
exports.ModifyObject = function (objectId, data, callback) {
setup.api()
.json()
.patch('/Object(' + objectId + ')')
.header("X-ApiKey", setup.apiKey())
.send(data)
.end(function (err, res, body) {
if(err) throw err;
callback(res);
});
};
exports.ModifyMultipleObjects = function (arrayOfObjectIds, data, callback) {
var failedArray = [];
async.timesLimit(arrayOfObjectIds.length, 3, function (n, next) {
exports.ModifyObject(arrayOfObjectIds[n], data, function (response) {
if(response.statusCode != 204) failedArray.push("Failed to modify object: " + arrayOfObjectIds[n]);
next(null);
});
}, function (err, failedArray) {
if(err) throw err;
callback(failedArray);
});
};
data
是一个 JSON 对象。
所以,我创建了多个对象,然后我在它们的 ID 数组上调用 ModifyMultipleObjects
,但是我得到了 TypeError: undefined is not a function
。以下是我在 mocha 测试中的调用方式:
var shared = require('../shared.js');
describe('test', function () {
it('modify multiple objects', function (done) {
var modData = {
"propA": 100,
"propB": 200
};
shared.ModifyMultipleObjects(objArray, modData, function (errArr) {
if(errArr.length > 0) throw new Error(errArr);
done();
});
});
});
objArray
有效。我已经检查了很多次了。
错误堆栈跟踪
Uncaught TypeError: Cannot read property undefined is not a function
at Object.exports.ModifyMultipleObjects(C:blahblahblah\shared.js:1374:8)
at Context.<anonymous> (C:\blahblahblah\general\modify_multiple_ojbects.js:46:10)
来自modify_multiple_objects.js
的行是:
shared.ModifyMultipleObjects(objArray, modData, function (errArr) {
来自shared.js
的行是:
async.timesLimit(arrayOfObjectIds.length, 3, function (n, next) {
我使用 async.timesLimit()
和 async.eachLimit()
重写了这两个函数(按照@Bergi 的建议)。
eachLimit()
:
async.eachLimit(objectIds, 5, function (item, next) {
exports.ModifyObject(item, data, function (res) {
if (res.statusCode != 204) throw new Error("failed to modify object " + item);
next();
}, function (err) {
callback();
});
});
timesLimit()
:
async.timesLimit(objectIds.length, 5, function (n, next) {
exports.ModifyObject(objectIds[n], data, function (res) {
if(res.statusCode != 204) throw new Error("failed to modify object " + objectIds[n]);
next();
});
}, function (err) {
callback();
});
timesLimit()
函数抛出与问题中所述相同的 Uncaught TypeError: undefined is not a function
错误。
但是,eachLimit()
工作得很好。我不明白为什么。据我所知,timesLimit()
写对了,这两个函数应该是一样的。
问题
我正在 API 使用节点的异步库。我遇到了似乎无法绕过的障碍。
我正在通过 RESTful API 修改数据库中的对象。我正在使用的命令称为 ModifyObject
并且有效。我正在制作另一个功能,允许我一次异步编辑多个对象。但是,我不想一次用 100 个请求访问我的服务器,所以我使用 async.timesLimit()
。你可以找到 the documentation for this function here。这是我的 shared.js
实用函数文件:
var async = require('async');
exports.ModifyObject = function (objectId, data, callback) {
setup.api()
.json()
.patch('/Object(' + objectId + ')')
.header("X-ApiKey", setup.apiKey())
.send(data)
.end(function (err, res, body) {
if(err) throw err;
callback(res);
});
};
exports.ModifyMultipleObjects = function (arrayOfObjectIds, data, callback) {
var failedArray = [];
async.timesLimit(arrayOfObjectIds.length, 3, function (n, next) {
exports.ModifyObject(arrayOfObjectIds[n], data, function (response) {
if(response.statusCode != 204) failedArray.push("Failed to modify object: " + arrayOfObjectIds[n]);
next(null);
});
}, function (err, failedArray) {
if(err) throw err;
callback(failedArray);
});
};
data
是一个 JSON 对象。
所以,我创建了多个对象,然后我在它们的 ID 数组上调用 ModifyMultipleObjects
,但是我得到了 TypeError: undefined is not a function
。以下是我在 mocha 测试中的调用方式:
var shared = require('../shared.js');
describe('test', function () {
it('modify multiple objects', function (done) {
var modData = {
"propA": 100,
"propB": 200
};
shared.ModifyMultipleObjects(objArray, modData, function (errArr) {
if(errArr.length > 0) throw new Error(errArr);
done();
});
});
});
objArray
有效。我已经检查了很多次了。
错误堆栈跟踪
Uncaught TypeError: Cannot read property undefined is not a function
at Object.exports.ModifyMultipleObjects(C:blahblahblah\shared.js:1374:8)
at Context.<anonymous> (C:\blahblahblah\general\modify_multiple_ojbects.js:46:10)
来自modify_multiple_objects.js
的行是:
shared.ModifyMultipleObjects(objArray, modData, function (errArr) {
来自shared.js
的行是:
async.timesLimit(arrayOfObjectIds.length, 3, function (n, next) {
我使用 async.timesLimit()
和 async.eachLimit()
重写了这两个函数(按照@Bergi 的建议)。
eachLimit()
:
async.eachLimit(objectIds, 5, function (item, next) {
exports.ModifyObject(item, data, function (res) {
if (res.statusCode != 204) throw new Error("failed to modify object " + item);
next();
}, function (err) {
callback();
});
});
timesLimit()
:
async.timesLimit(objectIds.length, 5, function (n, next) {
exports.ModifyObject(objectIds[n], data, function (res) {
if(res.statusCode != 204) throw new Error("failed to modify object " + objectIds[n]);
next();
});
}, function (err) {
callback();
});
timesLimit()
函数抛出与问题中所述相同的 Uncaught TypeError: undefined is not a function
错误。
但是,eachLimit()
工作得很好。我不明白为什么。据我所知,timesLimit()
写对了,这两个函数应该是一样的。