首页 > 解决方案 > 节点 MySQL 的插入顺序

问题描述

我正在使用mysql.

这些图像放入数据库的顺序很重要。我知道有一个order专栏是可能的,但由于项目的后勤问题,我无法做到这一点。

因此,使用Map,我保持了对象的顺序,结果如下:

Map {
  0 => 'https://i.ebayimg.com/00/s/NTc5WDg0Ng==/z/dMkAAOSwHcpaoorf/$_03.JPG',
  1 => 'https://i.ebayimg.com/00/s/NTc5WDc4NA==/z/hVkAAOSwQ19aoorl/$_03.JPG',
  2 => 'https://i.ebayimg.com/00/s/NTc5WDgxMQ==/z/-kYAAOSwYBxaoorO/$_03.JPG',
  3 => 'https://i.ebayimg.com/00/s/NTgwWDgxMQ==/z/seAAAOSwxo9aoorR/$_03.JPG',
  4 => 'https://i.ebayimg.com/00/s/NTgwWDEwMzA=/z/p1AAAOSwW5laoorU/$_03.JPG',
  5 => 'https://i.ebayimg.com/00/s/NzY0WDExMTQ=/z/p10AAOSwW5laoorY/$_03.JPG',
  6 => 'https://i.ebayimg.com/00/s/NTE4WDc3Nw==/z/Yq0AAOSwVExaoorb/$_03.JPG',
  7 => 'https://i.ebayimg.com/00/s/NTgwWDEwMzA=/z/mNMAAOSwfTVaoori/$_03.JPG' }

伟大的。所以现在把这些放在数据库中:

data.images.forEach(function(image, j) {    

    let insert_image_query = "INSERT INTO images (file, is_external) VALUES ('" + image + "', 1)";

    mysqlQuery.executeQuery(insert_image_query).then(function (insert_image_response) {

    });


});

但它们并没有按顺序排列,有时非常随机。有什么我想念的吗?

标签: javascriptmysql

解决方案


ECMA-262 第 5 版规范和MDN 的Array.forEach()页面都显示了 的算法.forEach(),并且它肯定会按索引升序迭代数组元素(跳过从未分配过值的索引),但是特定请求的执行时间可能会有所不同。您传递给 的回调函数的每次调用.foreach()都不会持续相同的时间。它们都按您希望的顺序调用,但由于它们不是同步的,您的代码不会等待第一个完成,然后再执行下一个。

当然,某些浏览器可能无法正确实现该算法,但我不知道有哪些没有。

要解决这个问题,您可以将整个事情包装到异步函数中,并分别等待每个函数的执行

(async ()=>{
    for (let image of data.images){
        let insert_image_query = "INSERT INTO images (file, is_external) VALUES ('" + image + "', 1)";
        await mysqlQuery.executeQuery(insert_image_query).then(function (insert_image_response) {

        });
    }
})();

或使用.reduce()语法

data.images.reduce(async (lastItemsPromise, image) => {
    await lastItemsPromise;
    let insert_image_query = "INSERT INTO images (file, is_external) VALUES ('" + image + "', 1)";
    return mysqlQuery.executeQuery(insert_image_query).then(function (insert_image_response) {

    });
}, Promise.resolve());

推荐阅读