discovery.query
является асинхронной функцией, поэтому переменная filterStr
не будет определена, пока не будет достигнут обратный вызов.Вам нужно будет использовать filterStr
в обратном вызове discovery.query
или async/await
в блоке try/catch
, чтобы return
results
.
Асинхронные функции работали, позволяя емувыполняться без прерывания потока.Вот почему console.log(2.)
исполняется, а спустя некоторое время console.log(1.)
исполняется в рамках обратного вызова (из-за функции asynchronous
требуется некоторое время для достижения обратного вызова).Вы пытаетесь что-то сделать synchronously
, и для этого вам нужно провести рефакторинг своего кода. Нажмите здесь для получения дополнительной информации об асинхронном и синхронном выполнении.
Внутри обратного вызова :
getSimilarCasesFromID: function(req, res, next) {
const queryString = "id::"+req.params.id;
const params = {
'query': queryString,
'environment_id':environmentId,
'collection_id': collectionId,
'configuration_id': configurationId,
return: 'enriched_text'
};
const filterStrArr = [];
const FILTER_CONCEPT = "enriched_text.concepts.text:";
discovery.query(params, (error, results) => {
if (error) {
next(false, err, []);
} else {
let filterStr ="";
const conceptSize = results.results[0].enriched_text.concepts.length;
let concepts = {};
for (let i = 0; i < conceptSize; i++) {
concepts[i] = {
text: results.results[0].enriched_text.concepts[i].text,
relevance: results.results[0].enriched_text.concepts[i].relevance
};
filterStrArr[i].push(FILTER_CONCEPT + concepts[i].text);
}
filterStr = filterStrArr.join(",");
console.log(filterStr);
// utilize filterStr here
next(true, [], []);
}
});
},
С async/await
:
getSimilarCasesFromID: async function(req, res, next) {
const queryString = "id::"+req.params.id;
const params = {
'query': queryString,
'environment_id':environmentId,
'collection_id': collectionId,
'configuration_id': configurationId,
return: 'enriched_text'
}
const filterStrArr = [];
const FILTER_CONCEPT = "enriched_text.concepts.text:";
let filterStr ="";
try {
const results = await discovery.query(params);
const conceptSize = results.results[0].enriched_text.concepts.length;
let concepts = {};
for (let i = 0; i < conceptSize; i++) {
concepts[i] = {
text: results.results[0].enriched_text.concepts[i].text,
relevance: results.results[0].enriched_text.concepts[i].relevance
};
filterStrArr[i].push(FILTER_CONCEPT + concepts[i].text);
}
filterStr = filterStrArr.join(",");
console.log(filterStr);
// utilize filterStr here
next(true, [], []);
} catch(err) {
next(false, err, []);
}
},