2017-01-11 9 views
0

私はnodejsのような非同期言語には新しく、リンクを訪問してコードをダウンロードし、正規表現で抽出するWebスクレーパーを作成しようとしていますTHENリンクをクリックします。 (より良い方法はありますか?)私は、コールバックを使用することができます認識してんだけど、私は深い8-9のレベルを行かなければならないことを期待し、私は約束が進むべき道だと思いますプロミスはnodejsの手続き型コードで定義されていません

var promise = require("promise"); 
var request = require("request"); 

login(); 

function get_login_code() 
{ 
    request.get("someurl.com", function (error, response, body) 
    { 
     // just for example 
     body = 'TOKEN" value="hello world"'; 
     var login_code = body.match(/.TOKEN" value="([^"]+)../i); 
     return login_code 
    }); 
} 

function login() 
{ 
    var login_promise = promise.resolve(get_login_code()); 
    console.log(login_promise); 

} 

私が試しました約束事と混乱の組み合わせの束、しかし私はいつも未定義または価値がない約束を得る。コールバック地獄とまったく同じことなので、私は約束の中に約束関数を入れたいとは思わない。誰かが私が間違っていることを教えてもらえますか?私は本当にこのコードを8コールバックではなく手続き的にします。理想的な世界ではpromise.resolveは、get_login_code()が実際のコードを返すまで待っていますが、未定義ではありません。

出力:

Promise { _45: 0, _81: 1, _65: undefined, _54: null } 

所望の出力:

hello world 
+0

私はあなたが読んでお勧めしたい(http://stackoverflow.com/questions/14220321/how-do [非同期操作からのレスポンスを返す方法] -i-return-from-as-asynchronous-call)を使用して、 'return login_code'を愚かにしてから、約束についてもっと多く読むことができます。約束は、非同期操作がいつ行われたかを何とか知る魔法の力を持っていません。約束事を解決したい場合は、約束事を作成して 'resolve()'を呼び出さなければなりません。 – jfriend00

答えて

2

あなたのコードは何:(すなわちundefined)すぐget_login_codeの結果に解決され、新しい約束を作成login機能の内部

  • 、すなわち何も返さない

    • 通話get_login_codeundefined

    したがって、login_codeはまったく使用しません。

    有効にするには、login_codeに解決される約束を返すようにget_login_codeにする必要があります。あなたはpromise NPMモジュールを使用して考えてみて、コードは次のようになります。

    // uppercased, it's a constructor 
    var Promise = require("promise"); 
    var request = require("request"); 
    
    login(); 
    
    function get_login_code() 
    { 
        return new Promise(function (resolve, reject) { 
         request.get("someurl.com", function (error, response, body) { 
         if (err) { 
          reject(err); 
          return; 
         } 
         // just for example 
         body = 'TOKEN" value="hello world"'; 
         var login_code = body.match(/.TOKEN" value="([^"]+)../i); 
         resolve(login_code); 
         }); 
        }); 
    } 
    
    function login() 
    { 
        // return a new promise to use in subsequent operations 
        return get_login_code() 
         .then(function(login_code) { 
          console.log(login_code); 
         }); 
    } 
    
  • +0

    'request.get()'だけを一般的に約束し、 'get_login_code()'でそれを使用する方が良いでしょう。彼らはpromisified関数は、多くの操作のために再利用することができます。可能な限り最低レベルで約束し、より高いレベルで約束履行を使用することが常に最善です。より再利用可能なコードと一般的にクリーンなコードを作成します。 – jfriend00

    1

    あなたが拒否していない関数自体への決意を取り扱うことにより、解決処理するための機能で、新しい約束を作成する必要があります。 thenを使用して、約束から応答値を取得します。私はこれがうまくいくはずだと思います。

    var promise = require("promise"); 
    var request = require("request"); 
    
    
    function get_login_code() 
    { 
        var promise = new Promise(function(resolve, reject) { 
          request.get("someurl.com", function (error, response, body) 
          { 
          if (error) { 
           reject(error); 
          } else { 
           // just for example 
           body = 'TOKEN" value="hello world"'; 
           var login_code = body.match(/.TOKEN" value="([^"]+)../i); 
           resolve(login_code); 
          } 
          }); 
        });  
    } 
    
    get_login_code() 
         .then(function (code) { 
         console.log(code); 
    }); 
    
    関連する問題