Подождите, пока это не решит обещание, а затем вставьте аккуратно - PullRequest
0 голосов
/ 15 марта 2020

Я смотрю все утро, потому что этот код не работает для меня.

Я хочу, чтобы после того, как обещание было выполнено, «then» получает свой последний вставленный идентификатор (обещание) и аккуратно вставляет его в другую таблицу. В настоящее время сначала рисует все обещания, а потом просто потом или беспорядочно ...

con.query("SELECT ID FROM wp_posts ORDER BY ID DESC LIMIT 0,1;", function(err, result, fields) {
  console.log(result);
  for (var i = 0; i < getData.length; i++) {
    var source = getData[i]["source"];
    var text = getData[i]["text"];
    var quality = getData[i]["quality"];
    new Promise(function(resolve, reject) {
      var sql = "INSERT INTO `wp_posts` ( `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`,`post_excerpt`, `post_status`,`comment_status`, `ping_status`,`post_password`, `post_name`,`to_ping`,`pinged`, `post_modified`, `post_modified_gmt`,`post_content_filtered`,`post_parent`, `guid`,`menu_order`, `post_type`, `post_mime_type`,`comment_count`) VALUES (1, '" + fhoy + "', '" + fhoy + "', '', '" + make + "','', 'publish', 'closed', 'closed','','" + make + "','','', '" + fhoy + "', '" + fhoy + "','', '" + result[0].ID + "','','0', 'dt_links','' ,0);";
      con.query(sql, function(err, result) {
        if (err) throw err;
        resolve(result);
        console.log("1 registro link insertado");
      });
    }).then(function() {
      //new Promise(function(resolve, reject) {
      con.query("SELECT ID FROM wp_posts WHERE post_type='dt_links' ORDER BY ID DESC LIMIT 0,1;", function(err, result, fields) {
        console.log(result);
        var sql = "INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (" + result[0].ID + ",'_dool_url', '" + source + "'),(" + result[0].ID + ",'_dool_type','" + text + "'),(" + result[0].ID + ",'_dool_quality','" + quality + "');";

        con.query(sql, function(err, result) {
          if (err) throw err;
          console.log("1 registro link meta insertado");
        });
        // });
      });
    });
  }
});

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

Вот пример того, насколько чистыми могут быть вещи, если вы используете интерфейс на основе обещаний, встроенный в mysql2, для правильной последовательности всех ваших операций:

// using mysql2/promise
// parent function must be declared async

try {
    let posts = await con.query("SELECT ID FROM wp_posts ORDER BY ID DESC LIMIT 0,1;");
    console.log(posts);
    for (const post of posts) {
        const source = post.source;
        const text = post.text;
        const quality = post.quality;

        let sql = "INSERT INTO `wp_posts` ( `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`,`post_excerpt`, `post_status`,`comment_status`, `ping_status`,`post_password`, `post_name`,`to_ping`,`pinged`, `post_modified`, `post_modified_gmt`,`post_content_filtered`,`post_parent`, `guid`,`menu_order`, `post_type`, `post_mime_type`,`comment_count`) VALUES (1, '" + fhoy + "', '" + fhoy + "', '', '" + make + "','', 'publish', 'closed', 'closed','','" + make + "','','', '" + fhoy + "', '" + fhoy + "','', '" + posts[0].ID + "','','0', 'dt_links','' ,0);";
        await con.query(sql);
        console.log("1 registro link insertado");

        let result = con.query("SELECT ID FROM wp_posts WHERE post_type='dt_links' ORDER BY ID DESC LIMIT 0,1;")
        console.log(result);

        sql = "INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (" + result[0].ID + ",'_dool_url', '" + source + "'),(" + result[0].ID + ",'_dool_type','" + text + "'),(" + result[0].ID + ",'_dool_quality','" + quality + "');";
        await con.query(sql);
        console.log("1 registro link meta insertado");
    }
} catch(e) {
    // handle all db errors here
}

Мало того, что это намного проще для чтения и понимаю, но он также упорядочивает каждую из ваших операций с базой данных и собирает всю обработку ошибок в одном месте (раньше у вас не было обработки ошибок).

Список изменений:

  1. Переключитесь на mysql2 / обещание, чтобы мы могли использовать встроенный интерфейс обещаний.
  2. Используйте async и await, чтобы упростить последовательность асинхронных операций с базами данных для кода
  3. Использовать try/catch перехватывать и обрабатывать все ошибки базы данных в одном месте (ранее у вас не было разумной обработки ошибок)
  4. Переключиться на for/of как более удобный способ итерации массива
  5. Заменить все var объявления с const или let в зависимости от ситуации.
  6. Переключение синтаксиса с таких вещей, как getData[i]["quality"] на getData[i].quality, потому что это просто, а кавычки и скобки не нужны вокруг простого имени свойства.

Открытые проблемы:

  1. Ваш первый запрос в for l oop всегда одинаков каждый раз через л oop. Это не кажется правильным. Единственная ссылка на result в этом исходном запросе была result[0].ID, но это будет одно и то же значение каждый раз через l oop, так что что-то с этим явно не правильно. Я не думаю, что вы хотите вставлять одну и ту же запись каждый раз через l oop.
0 голосов
/ 15 марта 2020

Таким образом, за исключением уязвимостей SQL, вы можете лучше провести время с обещанной функцией con.query, называемой здесь queryP().

Я не уверен, что смогу захватить исходную логику c вашего кода, поскольку он многократно использовал result, и т. Д. c., Но идея должна быть там.

Обратите внимание, , что здесь возможна проблема в том, что если несколько одновременных запросов изменяют wp_posts, изменяемые идентификаторы записей могут измениться. Вы можете посмотреть на это, чтобы получить последний вставленный идентификатор .

function queryP(con, sql, variables = []) {
  return new Promise((resolve, reject) => {
    con.query(sql, variables, (err, result, fields) => {
      if (err) {
        return reject(err);
      }
      return resolve({ result, fields });
    });
  });
}

async function processDataThing(con, result, dataThing) {
  var source = dataThing["source"];
  var text = dataThing["text"];
  var quality = dataThing["quality"];
  const r1 = await queryP(
    con,
    "INSERT INTO `wp_posts` ( `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`,`post_excerpt`, `post_status`,`comment_status`, `ping_status`,`post_password`, `post_name`,`to_ping`,`pinged`, `post_modified`, `post_modified_gmt`,`post_content_filtered`,`post_parent`, `guid`,`menu_order`, `post_type`, `post_mime_type`,`comment_count`) VALUES (1, '" +
      fhoy +
      "', '" +
      fhoy +
      "', '', '" +
      make +
      "','', 'publish', 'closed', 'closed','','" +
      make +
      "','','', '" +
      fhoy +
      "', '" +
      fhoy +
      "','', '" +
      result[0].ID +
      "','','0', 'dt_links','' ,0);",
  );
  console.log("1 registro link insertado");
  const r2 = await queryP(
    con,
    "SELECT ID FROM wp_posts WHERE post_type='dt_links' ORDER BY ID DESC LIMIT 0,1",
  );
  const result2 = r2.result;
  const r3 = await queryP(
    con,
    "INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (" +
      result2[0].ID +
      ",'_dool_url', '" +
      source +
      "'),(" +
      result2[0].ID +
      ",'_dool_type','" +
      text +
      "'),(" +
      result2[0].ID +
      ",'_dool_quality','" +
      quality +
      "');",
  );
}

// ...

async function doThings(con, getData) {
  const { result } = await queryP(con, "SELECT ID FROM wp_posts ORDER BY ID DESC 
LIMIT 0,1");
  const dataThingPromises = getData.map(dataThing => processDataThing(con, result, dataThing));
  return await Promise.all(dataThingPromises);
}

// ...

doThings(con, getData).then(() => console.log("All done!"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...