如何在Node.js中嵌套的Promise中修复竞争条件?

时间:2018-01-05 18:28:00

标签: javascript node.js promise sequelize.js transformation

好的,所以这个问题是this question的延伸,与this question有关。调用函数格式的代码可以在第一个问题中看到。这是我的转换中的代码:

format() {
    return new Promise((resolve, reject) => {
        return Database.getInstance().getModel('feature_default').findAll({})
        .then((databaseObjects) => {
            this.getJsonObject().features = {};
            for (let databaseObject of databaseObjects) {
                console.log('ADD FEATURE DEFAULT TO ARRAY ' + databaseObject.id);
                this.getJsonObject().features[databaseObject.id] = JSON.parse(databaseObject.default_json);
            }
            console.log('RESOLVE FEATURE DEFAULT');
            return resolve(this.getJsonObject());
        })
        .catch((e) => {
            return reject(e);
        });
    });
}

我试图删除反模式,并且我看到完全相同的行为:

format() {
    return Database.getInstance().getModel('feature_default').findAll({})
        .then((databaseObjects) => {
            this.getJsonObject().features = {};
            for (let databaseObject of databaseObjects) {
                console.log('ADD FEATURE DEFAULT TO ARRAY ' + databaseObject.id);
                this.getJsonObject().features[databaseObject.id] = JSON.parse(databaseObject.default_json);
            }
            console.log('RESOLVE FEATURE DEFAULT');
            return this.getJsonObject();
        })
        .catch((e) => {
            throw e;
        });
}

以下是代码调用格式:

            var promises = databaseObjects.map(databaseObject => {
                var jsonObject = {};

                var transform = new Transform();
                transform.setDatabaseObject(databaseObject);
                transform.setJsonObject(jsonObject);

                transform.baseFormat()
                .then(() => transform.format())
                .then(() => {
                    res.locals.retval.addData(jsonObject);
                    res.locals.retval.addErrors(transform.getErrors());
                    res.locals.retval.addWarnings(transform.getWarnings());
                }).catch((e) => {
                    console.log('Caught error during format of existing object: ');
                    console.log(e);
                    this.error(e, res);
                    throw e;
                });
            });
            Promise.all(promises)
            // ...

我已尝试在第二个问题中执行Promise.all,其中每个承诺都会为数组添加一项功能,但这也无法解决此问题。

使用此调用,当我第一次查询服务器时,我得到了正确的结果:

{
  "errors": [],
  "warnings": [],
  "data": [
    {
      "id": 1,
      "name": "All",
      "enabled": 1,
      "features": {
        ...
      }
    }
  ]
}

然而,在接下来的任何电话中我都会收到:

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

我根本没有更改任何参数或通话。我相信我没有锁定承诺,但我不知道我应该到哪里回来。

0 个答案:

没有答案