尽管被分配了变量未定义的外部功能范围?

问题描述 投票:1回答:2

问题

我遇到了一个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)行之前。这可能是由沃森发现的响应时间造成的吗?请记住该服务位于澳大利亚悉尼?如果是这样,有没有其他人有这方面的经验?

node.js reactjs express ibm-watson watson-discovery
2个回答
1
投票

discovery.query是一个异步函数,因此变量filterStr在到达回调之前不会被定义。你需要在filterStr的回调中使用discovery.query,或者在async/await区块内使用try/catchreturn 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, []);
  }
},

1
投票

discovery.query()有两个属性, 1 - 参数 2 - 功能(也称为回调)

discover.query()被执行,但在执行回调之前返回, next console.log(“FullString(2。)”+ filterStr);被执行 最后,执行回调。

您需要在回调中采取所需的操作。

这很痛苦,但JavaScript是如何工作的。更准确地说,discovery.query()如何工作。更糟糕的是当你有嵌套的回调时,它会变得非常混乱并且有一个名字:“callback hell”。这个问题的现代解决方案是承诺和异步等待。

祝好运

© www.soinside.com 2019 - 2024. All rights reserved.