如何从javascript函数中的.then中返回一个值?

时间:2017-10-01 04:02:27

标签: javascript node.js

我试图在javascript函数中返回从.then调用中提取的值(如果我使用的是不正确的术语,请原谅我,请纠正我,以便我可以学习)。这是我正在使用的代码

function analyzeSentimentOfText (text) {
  // [START language_sentiment_string]
  // Imports the Google Cloud client library
  const Language = require('@google-cloud/language');
  // Instantiates a client
  const language = Language();

  // The text to analyze, e.g. "Hello, world!"
  // const text = 'Hello, world!';

  const document = {
    'content': text,
    type: 'PLAIN_TEXT'
  };


  // Detects the sentiment of the document
  language.analyzeSentiment({ document: document }) 

    .then((results) => {
      const sentiment = results[0].documentSentiment;

      console.log(`Document sentiment:`);
      console.log(`  Score: ${sentiment.score}`);
      console.log(`  Magnitude: ${sentiment.magnitude}`);

    })
    .catch((err) => {
      console.error('ERROR:', err);
    });
  // [END language_sentiment_string]
}

我想要完成的是提取结果[0] .documentSentiment.sentiment.score的情绪评分(理想情况下也是幅度)。

我试图做的是这个

function analyzeSentimentOfText (text) {

  const Language = require('@google-cloud/language');
  const language = Language();
  const document = {
    'content': text,
    type: 'PLAIN_TEXT'
  };

  language.analyzeSentiment({ document: document }) 

    .then((results) => {
      const sentiment = results[0].documentSentiment;
      return sentiment.score;
    })
    .catch((err) => {
      console.error('ERROR:', err);
    });
  // [END language_sentiment_string]
}

任何人都可以帮助我吗?或者我是否必须完全改变方法?

谢谢, 布拉德

2 个答案:

答案 0 :(得分:1)

很遗憾,您无法返回确切的值,但您可以返回Promise。这意味着函数analyzeSentimentOfText将返回一个解析为值而不是实际值的Promise。

像这样:

function analyzeSentimentOfText (text) {

  const Language = require('@google-cloud/language');
  const language = Language();
  const document = {
    'content': text,
    type: 'PLAIN_TEXT'
  };

  return language.analyzeSentiment({ document: document }) 
    .then(results => results[0].documentSentiment.score);
  // [END language_sentiment_string]
}

然后将使用这样:

analyzeSentimentOfText("sometext")
  .then((score) => {
    console.log(score); // Whatever the value of sentiment.score is
  })
  .catch((err) => {
    console.error('ERROR:', err);
  });

如果您定位到Node v7.6或更高版本,则可以使用async/await

async function analyzeSentimentOfText (text) {
  const Language = require('@google-cloud/language');
  const language = Language();
  const document = {
    'content': text,
    type: 'PLAIN_TEXT'
  };

  return (
    await language.analyzeSentiment({ document: document })
  )[0].documentSentiment.score
}

(async () => {
  try {
    let score = await analyzeSentimentOfText("someText");
  } catch (err) {
    console.error('ERROR:', err);
  }
})();

以上原因具有异步推荐调用功能的原因是因为await 只能在async函数中使用。

答案 1 :(得分:0)

你试过了吗?

function analyzeSentimentOfText (text) {

const Language = require('@google-cloud/language');
const language = Language();
const document = {
  'content': text,
  type: 'PLAIN_TEXT'
};

return language.analyzeSentiment({ document: document }) 
  .then((results) => {
    const sentiment = results[0].documentSentiment;
    return sentiment.score;
  })
  .catch((err) => {
    console.error('ERROR:', err);
  });
// [END language_sentiment_string]