如何在JavaScript中对GET方法进行同步响应



我想将JSON对象响应到路径(例如/getAbencesWithNames(。我已经使用includeNames()函数从JSON文件中读取数据,处理它并将其保存在我试图响应的全局JSON对象中。问题是以下命令res.end(JSON.stringify(temp, null, "t"));异步执行,因为includeNames()函数中有I/O代码。如何让这个命令等待我的函数完成,换句话说,让它同步运行?

function includeNames(){
members().then(membersPayload => {
// var counter = 1;
for (var i in respondJson){
var absencesID = respondJson[i].userId;
for (var j in membersPayload){
var membersID = membersPayload[j].userId;
if (absencesID == membersID){
var nameValue = membersPayload[j].name;
JSON.stringify(nameValue);
respondJson[i]["name"] = nameValue;
// console.log(counter + ": " + membersPayload[j].name);
// counter++;
break;
}
}
}
console.log("ITERATION COMPLETED");
}).catch((err) => console.error('error: ' + error.message));
return respondJson;
};

app.get('/getAbsencesWithNames', async (req, res) => {
var temp = await includeNames();
res.end(JSON.stringify(temp, null, "t"));
console.log("RESPOND SENT");
});

控制台输出为:

RESPOND SENT
ITERATION COMPLETED

当我期待的时候:

ITERATION COMPLETED
RESPOND SENT

您必须重写函数才能返回Promise。

function includeNames() {
return new Promise((resolve, reject) => {
members().then(membersPayload => {
// var counter = 1;
for (var i in respondJson){
var absencesID = respondJson[i].userId;
for (var j in membersPayload){
var membersID = membersPayload[j].userId;
if (absencesID == membersID){
var nameValue = membersPayload[j].name;
JSON.stringify(nameValue);
respondJson[i]["name"] = nameValue;
// console.log(counter + ": " + membersPayload[j].name);
// counter++;
break;
}
}
}
resolve(respondJson)
console.log("ITERATION COMPLETED");
})
});
};
// you cant use it as you're using
const result = await includeNames()
// or with Promise chain
includeNames().then(result => console.log(result))

最新更新