модели автообновления с loopback lb3 - асинхронная ловушка - PullRequest
0 голосов
/ 18 октября 2019

Я просто схожу с ума от этого, некоторые могут помочь мне, пожалуйста.

Возможно, кто-то уже решил это правильно?

Итак, у меня есть приложение с несколькими источниками данных, и я хочу ихдля автоматического обновления. И все же я не могу поверить, что я должен это сделать ... Разве это не должно быть похоже на общение?

Я поместил этот скрипт в server / boot / 20-autoUpdateDb.js


'use strict';

var cluster = require('cluster');

module.exports = function(app, cb) {
  if (cluster.isWorker) {
    process.nextTick(cb);
  } else {

    const updateDS = async dataSources => {
      await dataSources.forEach(async (ds, key, arr) => {
        if (ds.autoupdate) {
          console.log('Proceeding with dataSource:', ds.name);

          const x = await new Promise(r => {
            ds.autoupdate(err => {
              if (err) throw err;

              console.log(
                // 'Auto Updated Models [' + Object.keys(app.models) + ']:',
                'Auto Updated Models in',
                ds.name,
                '(',
                ds.adapter.name,
                ')',
              );

              r();
            });
          });
        }
      });
    };

    // I just couldn't find a better way as all datasources
    // exist in double ex: db,Db 

    var appDataSources = [
      app.dataSources.db,
      app.dataSources.dbData,
      app.dataSources.dbPool,
    ];

    updateDS(appDataSources).then(() => {
      console.log('Autoupdate of all models done.');
      process.nextTick(cb);
    });
  }
};

в качестве вывода я получаю

Proceeding with dataSource: db
Proceeding with dataSource: dbData
Proceeding with dataSource: dbPool
Auto Updated Models in dbPool ( sqlite3 )
Autoupdate of all models done.
Web server listening at: http://localhost:3000
Browse your REST API at http://localhost:3000/explorer
Auto Updated Models in dbData ( sqlite3 )
Auto Updated Models in db ( sqlite3 )

1 Ответ

1 голос
/ 21 октября 2019

Array.prototype.forEach не ждет обещаний. Попробуйте это:

const appDataSources = [
  app.dataSources.db,
  app.dataSources.dbData,
  app.dataSources.dbPool,
]

(async () => {
  for (let i = 0; i < appDataSources.length; i++) {
    const ds = appDataSources[ i ]

    if (ds.autoupdate) {
      await new Promise((resolve, reject) => {
        ds.autoupdate(err => {
          if (err) return reject(err)
          resolve()
        })
      })
    }
  }
})()
...