2017-08-30 103 views
1
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,但結果仍然是一樣的。如何重新編寫我的方法,直到方法執行完成才返回值。我也嘗試過使用回撥進行書寫,但無法獲得期望的結果(可能是我以錯誤的方式執行回撥)

回答

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(); 

看到官方documentation約在這裏承諾。

看到這個tutorial瞭解有關承諾的例子。

0

您可以使用簡單的回調來避免這種異步性質。

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; 
     } 

     } 


    }