2017-01-08 6 views
0

私の現在のプロジェクトでは、私は約束とブルーバードが新しく、私は多くの非同期API呼び出しを処理する必要があります。ツール。 私のインポートされたモジュールの一つは次のようになります。NodeJSモジュールに青い鳥の約束を追加して、関数が定義されていません

var Promise = require("bluebird"); 
var watson = Promise.promisifyAll(require('watson-developer-cloud')); 

var conversation = watson.init(); 

exports.enterMessage = function (inputText) { 
    var result; //want to return 
    conversation.message({ 
    input: { 
     "text": inputText 
    } 
    }, function(err, response) { 
    if (err) { 
     console.log('error:', err); 
     result = err; 
    } 
    else { 
     result = response.output.text; 
    } 
    }); 
    console.log(result); //sync call, result === undefined 
    return result; 
} 

私の質問は、私はこの質問にアプローチする方法ですか?私は、fsのようなIOで約束を使用する例を理解しています。だから私はconversation.message(...).then(function(response){result = response.output.text})をやって方法を模倣しようとしますが、それはconversation.message(...)と言います。then()は定義されていません。

+0

約束は非同期コードの同期をしない...あなたの結果は非同期に決定されていますが、あなたはおそらく、読む必要が –

+0

synchronousluy結果を返すと、 [非同期呼び出しから応答を返すにはどうすればいいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call)これは、プレーンコールバックと約束の使用の両方のオプションを含んでいます。主なフィードバックは、非同期のプログラミング方法を学ばなければならないということです。プロミスのようなツールは、非同期プログラミングを容易にしますが、非同期プログラミングを同期プログラミングにしません。値が非同期関数から来た場合、単に値を同期的に返すことはできません。あなたがそれをするのに役立つツールはありません。 – jfriend00

+0

@ JaromandaXありがとう、それは私が今学んでいる問題です –

答えて

2

jfriend00のリンクのおかげで、ロジックが修正され、この非同期呼び出しを処理する正しい方法が使用されました。ここで

が固定コードです:

//app.js 
    var Promise = require("bluebird"); 
    var conversation = Promise.promisifyAll(require('./watson-conversation')); 
    conversation.enterMessage(currentInput).then(function(val){ 
     res.send(val)} 
    ).catch(function(err){ 
     console.log(err) 
    }); 
    }); 

//watson-conversation.js 

var conversation = watson.init(); 

exports.enterMessage = function (inputText) { 
    return new Promise(function(resolve, reject){ 
    conversation.message({ 
     input: { 
     "text": inputText 
     } 
    }, function(err, response) { 
     if (err) { 
     console.log('error:', err); 
     reject(err); 
     } 
     else { 
     resolve(response.output.text); 
     } 
    }); 
    }); 
} 
関連する問題