gpt4 book ai didi

node.js - 尽管已赋值,但变量在函数作用域外未定义?

转载 作者:太空宇宙 更新时间:2023-11-03 23:16:23 24 4
gpt4 key购买 nike

问题

我在 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.) 行。我无法判断我是否错过了什么并犯了一个愚蠢的、卑微的错误。

服务器上的输出: enter image description here

有趣的是,如图 1 所示,FullString (2.) 出现在行 (1.) 之前。这是否是由于 Watson Discovery 的响应时间造成的?记住该服务位于澳大利亚悉尼?如果是这样,其他人有这方面的经验吗?

最佳答案

discovery.query 是一个异步函数,因此变量 filterStr 在到达回调之前不会被定义。您需要在 discovery.query 的回调中使用 filterStr 或在 try/catch< 中使用 async/await/code> block 返回结果

异步函数的工作原理是允许它在不中断线程的情况下执行。这就是为什么 console.log(2.) 被执行,然后一段时间后,console.log(1.) 在回调中被执行(由于函数由于异步,需要一些时间才能到达回调)。您正在尝试同步执行操作,为此,您需要重构代码。 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, []);
}
},

关于node.js - 尽管已赋值,但变量在函数作用域外未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54971552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com