代码应如何工作:
发生与数据库的连接,并请求从表中获取数组。 然后在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);
}
})();
}
}
...
答案 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);
}
}
}
})();