在JavaScript / Node.js中运行.map时如何跳过回调?

时间:2017-09-29 21:28:35

标签: javascript node.js typescript express arrow-functions

this question的续集,我需要在POST请求中接受多个对象,然后为每个对象处理它,保存它,然后将保存的对象返回到前端(以便客户端可以查看哪些列已成功编辑。)

当我使用.map时,它会保存到数据库中,我可以确认这一点。但是,我有两个问题:

  1. 它没有正确执行res.locals.retval.addData(dtoObject);,而且我返回的有效负载内部没有数据传输对象。
  2. 我的对象验证无法在map的回调中完成。我最初尝试reduce,但这根本不起作用,只是将所有相同的值保存到每个数据库对象。在映射时如何排除无效的JSON对象?

    var jsonObjects = req.body;
    //for (var n in req.body) {
    var promises = jsonObjects.map((jsonObject) => {
        var transform = new Transform();
    
        // VALIDATION OF jsonObject VARIABLE IS HERE
    
        if (jsonObject.id == 0) {
            var databaseObject = Database.getInstance().getModel(objectName).build(jsonObject);
    
            transform.setNew(true);
            transform.setJsonObject(jsonObject);
            transform.setDatabaseObject(databaseObject);
    
            transform.baseExtract()
            .then(() => transform.extract())
            .then(() => transform.clean())
            .then(() => transform.getDatabaseObject().save())
            .then(function(data) {
                // PROCESSING DATA
            }).catch((e) => {
                // ERROR
            });
        } else {
            var queryParameters = {
                where: {id: jsonObject.id}
            };
            console.log("Query parameters: ");
            console.log(queryParameters);
            Database.getInstance().getModel(objectName).findOne(queryParameters).then((databaseObject) => {
                transform.setJsonObject(jsonObject);
                transform.setDatabaseObject(databaseObject);
            })
            .then(() => transform.baseExtract())
            .then(() => transform.extract())
            .then(() => transform.clean())
            .then(() => transform.getDatabaseObject().save())
            .then((data) => {
                // PROCESSING DATA
            }).catch((e) => {
                // ERROR
            });
        }
    });
    
    Promise.all(promises)
    .then((results) => {
        return next();
    }).catch((e) => {
        throw e;
    });
    
  3. 这是产生的有效载荷:

    {
      "errors": [],
      "warnings": [],
      "data": []
    }
    

1 个答案:

答案 0 :(得分:2)

  1. 正如@KevinB在评论中所说的那样,你错过了箭头函数内部的返回调用,因此数据库保存正在进行,因为它们是Promise链的一部分,但是推送到响应会等待返回,然后Express.js调用在Promises之前解析。将return Database.getInstance()return transform.baseExtract()添加到您的代码中以解决此问题。
  2. 使用Array.prototype.filter()删除要忽略的元素,因为您不需要对它们执行Promise,然后在生成的数组上调用Array.prototype.map()。如果您不想使用箭头功能,可以将其指定为filtermap的参数:

    jsonObjects.filter(function(jsonObject){

    },这个);

    var promises = jsonObjects.map(function(jsonObject){

    },这个);