问题
我遇到了一个MERM应用程序的问题,即在整个函数的主体中声明的变量被赋值给子函数,但是,每当我尝试在整个函数的末尾操作/显示这个变量时,它返回一个“未定义”。
码
getSimilarCasesFromID: function(req, res, next) {
let queryString = "id::"+req.params.id;
let params = {
'query': queryString,
'environment_id':environmentId,
'collection_id': collectionId,
'configuration_id': configurationId,
return: 'enriched_text'
}
let filterStrArr = [];
const FILTER_CONCEPT = "enriched_text.concepts.text:";
let filterStr ="";
discovery.query(params, (error, results) => {
if (error) {
next(false, err, []);
} else {
let 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] = FILTER_CONCEPT + concepts[i].text;
}
filterStr = filterStrArr.join(",");
console.log(filterStr);
//1. Works and displays---------------
}
});
console.log("FullString (2.)"+filterStr);
//2. Undefined????????????????????------------
next(true, [], []);
},
我指的是第(1)行和第(2)行。我不知道我是否遗漏了一些东西并且犯了一个愚蠢的,卑鄙的错误。
有趣的是,如图1所示,FullString(2。)出现在第(1)行之前。这可能是由沃森发现的响应时间造成的吗?请记住该服务位于澳大利亚悉尼?如果是这样,有没有其他人有这方面的经验?
discovery.query
是一个异步函数,因此变量filterStr
在到达回调之前不会被定义。你需要在filterStr
的回调中使用discovery.query
,或者在async/await
区块内使用try/catch
来return
results
。
异步函数允许在不中断线程的情况下执行它。所以这就是为什么console.log(2.)
被执行,然后一段时间之后,console.log(1.)
在回调中被执行(由于函数是asynchronous
,它需要一些时间来达到回调)。你正在尝试做synchronously
,为此,你需要重构你的代码。有关异步和同步执行的更多信息,请访问Click here。
在回调中:
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, []);
}
},
discovery.query()有两个属性, 1 - 参数 2 - 功能(也称为回调)
discover.query()被执行,但在执行回调之前返回, next console.log(“FullString(2。)”+ filterStr);被执行 最后,执行回调。
您需要在回调中采取所需的操作。
这很痛苦,但JavaScript是如何工作的。更准确地说,discovery.query()如何工作。更糟糕的是当你有嵌套的回调时,它会变得非常混乱并且有一个名字:“callback hell”。这个问题的现代解决方案是承诺和异步等待。
祝好运