修改和添加数据不是异步的

时间:2019-03-22 05:22:28

标签: node.js

代码应如何工作:

发生与数据库的连接,并请求从表中获取数组。 然后在Rest API中执行授权。我从Rest Api那里请求一个数据数组,以便与数据库中的数组做进一步比较(我忘了提到Rest Api中的数据库,我连接的数据库是不同的,并且在不同的服务器上)。在得到数组之后,我开始循环。并且,如果来自Rest API的数据与来自数据库的数据一致,则将在Rest API中更新数据。否则,如果数据不相等,则将来自数据库的数据添加到REST API。

但是我的帖子和补丁不是异步的。因此,在更新数据的过程中会挂起。然后他完全失败了(只是过程被无误地中断了)。我究竟做错了什么?以及如何解决?

我将requestretry库用于发布和补丁请求。

...
var is_find = false
api = JSON.parse(api.body)
for (var i = 0; i < db.rows.length; i++) {
    is_find = false
    for (var j = 0; j < api.rows.length; j++) {
        if (db.rows[i].NAME === api.rows[j].Name) {
            (async function() {
                is_find = true
                var options = {
                    url: url,
                    method: 'POST',
                    form: {
                        Name: db.rows[i].NAME
                    },
                    headers: {
                        'Cookie': cookies
                    }
                };
                try {
                    var patch = await request(options);
                    console.log('patch:', patch.body);
                } catch (err) {
                    console.log('Error:', err);
                }
            })();
            break
        }
    }
    if (!is_find) {
        (async function() {
            var options = {
                url: url,
                method: 'POST',
                form: {
                    Name: db.rows[i].NAME
                },
                headers: {
                    'Cookie': cookies
                }
            };
            try {
                var post = await request(options);
                console.log('post:', post.body);
            } catch (err) {
                console.log('Error:', err);
            }
        })();
    }
}
...

1 个答案:

答案 0 :(得分:1)

您应该尝试将所有循环包装在如下所示的单个异步函数中,而不是包装在多个异步函数中,因为这样会导致is_find标志的值不一致。

    (async function () {
    for (var i = 0; i < db.rows.length; i++) {
        is_find = false
        for (var j = 0; j < api.rows.length; j++) {
            if (db.rows[i].NAME === api.rows[j].Name) {
                is_find = true
                var options = {
                    url: url,
                    method: 'POST',
                    form: {
                        Name: db.rows[i].NAME
                    },
                    headers: {
                        'Cookie': cookies
                    }
                };
                try {
                    var patch = await request(options);
                    console.log('patch:', patch.body);
                } catch (err) {
                    console.log('Error:', err);
                }
                break
            }
        }
        if (!is_find) {
            var options = {
                url: url,
                method: 'POST',
                form: {
                    Name: db.rows[i].NAME
                },
                headers: {
                    'Cookie': cookies
                }
            };
            try {
                var post = await request(options);
                console.log('post:', post.body);
            } catch (err) {
                console.log('Error:', err);
            }
        }
    }
})();