【问题标题】:method returning value before completing function execution方法在完成函数执行之前返回值
【发布时间】:2018-02-08 10:44:43
【问题描述】:
function rip(intent_update, output_rnr){
    var headers_conv = {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'Authorization': 'Basic YWFjZWU2M'
    };
    var dataString = '{ "output": { "text": {  "values": [' + output_rnr + '] }  }  }';
    var options_conv = {
        url: 'https://watson-api-explorer.mybluemix.net/'+ intent_update + '?version=2017-05-26',
        method: 'POST',
        headers: headers_conv,
        body: dataString
    };
    function callback_conv(error, response, body) {
        if (!error && response.statusCode === 200) {
            console.log(body);
        }
    }
    request(options_conv, callback_conv);
}
app.post('/api/message', function(req, res) {
  var workspace = process.env.WORKSPACE_ID || '<workspace-id>';
  }
  var payload = {
    workspace_id: workspace,
    context: req.body.context || {},
    input: req.body.input || {}
  };

  // Send the input to the conversation service
  conversation.message(payload, function(err, data) {
    if (err) {
      return res.status(err.code || 500).json(err);
    }
    return res.json(updateMessage(payload, data));
  });
});

function updateMessage(input, response) {
  if (!response.output) {
    response.output = {};
  } else {
    if (response.intents.length > 0 && (response.intents[0].intent === 'rnr')) {
            response = getCalculationResult(response);
    }

  }
   return response;
 }

function getCalculationResult(response){

    var result = '';
    if(response.intents[0].intent === 'rnr'){
        var question  = response.input.text;
        var query     = qs.stringify({q: question, ranker_id: ranker_id, fl: 'contentHtml'});

        solrClient.get('fcselect', query, function(err, searchResponse) {
            if(err) {
                 console.log('Error searching for documents: ' + err);
            }
            else {
                result = JSON.stringify(searchResponse.response.docs[0].contentHtml, null, 1);
                rip(response.intents[0].intent, result);
            }
        });

    }
    /*
     * if(result === ''){
            setTimeout(function(){
            response.output.text[0] = result + response.input.text;
        }, 15000);
    }
    else{
        var output = result + response.input.text;
        response.output.text[0] = output;
    }
    */
    response.output[0].text = response.output[0].text + result;
    return response;

}

此代码在完成方法执行之前从函数返回值。我尝试使用 setTimeout 但结果仍然相同。如何重新编写我的方法以等到方法执行完成后再返回值。我也试过用回调写,但无法得到想要的结果(可能是我以错误的方式实现回调)

【问题讨论】:

    标签: node.js asynchronous watson-conversation asynccallback


    【解决方案1】:

    您可以使用Promise.all,并用一个自定义代码说:“只要这些功能都完成了,那么就这样做”。

    例如...

    var message = "";
    
    promise1 = new Promise((resolve, reject) => {
        setTimeout(() => {
            message += "my";
            resolve(message);
        }, 2000)
    })
    
    promise2 = new Promise((resolve, reject) => {
        setTimeout(() => {
            message += " first";
            resolve(message);
        }, 2000)
    })
    
    promise3 = new Promise((resolve, reject) => {
        setTimeout(() => {
            message += " promise";
            resolve(message);
        }, 2000)
    })
    
    var printResult = (results) => {console.log("Results = ", results, "message = ", message)}
    
    function main() {
        // See the order of promises. Final result will be according to it
        Promise.all([promise1, promise2, promise3]).then(printResult);
        Promise.all([promise2, promise1, promise3]).then(printResult);
        Promise.all([promise3, promise2, promise1]).then(printResult);
        console.log("\"\"" + message);
    }
    
    main();
    

    在这里查看 Promises 的官方 documentation

    请参阅此tutorial 以了解有关 Promises 的示例。

    【讨论】:

      【解决方案2】:

      您可以使用简单的回调来避免这种异步性质。

          function rip(intent_update, output_rnr){
              var headers_conv = {
                  'Content-Type': 'application/json',
                  'Accept': 'application/json',
                  'Authorization': 'Basic YWFjZWU2M'
              };
              var dataString = '{ "output": { "text": {  "values": [' + output_rnr + '] }  }  }';
              var options_conv = {
                  url: 'https://watson-api-explorer.mybluemix.net/'+ intent_update + '?version=2017-05-26',
                  method: 'POST',
                  headers: headers_conv,
                  body: dataString
              };
              function callback_conv(error, response, body) {
                  if (!error && response.statusCode === 200) {
                      console.log(body);
                  }
              }
              request(options_conv, callback_conv);
          }
          app.post('/api/message', function(req, res) {
            var workspace = process.env.WORKSPACE_ID || '<workspace-id>';
            }
            var payload = {
              workspace_id: workspace,
              context: req.body.context || {},
              input: req.body.input || {}
            };
      
            // Send the input to the conversation service
            conversation.message(payload, function(err, data) {
              if (err) {
                return res.status(err.code || 500).json(err);
              }
              updateMessage(payload,data,function(resultData){
                  if(resultData){
                      return res.json(resultData);
                  }
              });
      
            });
          });
      
          function updateMessage(input, response,callback) {
            if (!response.output) {
              response.output = {};
            } else {
              if (response.intents.length > 0 && (response.intents[0].intent === 'rnr')) {
                      getCalculationResult(response,function(result){
                      response=result;
                      if(callback){
                          callback(response);
                          return response;
                      }
                  });
              }
            }
           }
      
          function getCalculationResult(response,callback){
      
              var result = '';
              if(response.intents[0].intent === 'rnr'){
                  var question  = response.input.text;
                  var query     = qs.stringify({q: question, ranker_id: ranker_id, fl: 'contentHtml'});
      
                  solrClient.get('fcselect', query, function(err, searchResponse) {
                      if(err) {
                           console.log('Error searching for documents: ' + err);
                      }
                      else {
                          result = JSON.stringify(searchResponse.response.docs[0].contentHtml, null, 1);
                          rip(response.intents[0].intent, result);
                      }
                  });
              if(callback){
                  response.output[0].text = response.output[0].text + result;
                  callback(response);
                  return response;
              }
      
              }
      
      
          }
      

      【讨论】:

        猜你喜欢
        • 2017-06-07
        • 2021-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-10
        • 2019-09-27
        • 1970-01-01
        • 2021-12-02
        相关资源
        最近更新 更多