问题

我正在使用将异步库用于节点的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()是正确编写的,这两个函数应该相同。

关于javascript - async.timesLimit()将不接受有效的回调函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31567183/

10-09 05:32