2017-02-19 3 views
2

私の例のように、複数のAPIを別の(後で)連続して呼び出す方が、より良い、より美しい方法がありますか?NodeJS:複数のAPI呼び出しを直列に書くための良い方法

var request = require('request'); 

    request('http://www.test.com/api1', function (error, response, body) { 
    if (!error && response.statusCode == 200) { 

     request('http://www.test.com/api1', function (error, response, body) { 
     if (!error && response.statusCode == 200) { 

      request('http://www.test.com/api1', function (error, response, body) { 
      if (!error && response.statusCode == 200) { 

       //And so on... 

      } 
      }) 

     } 
     }) 

    } 
    }) 
+0

本物のケースを書いてください。私たちはあなたを助けます –

答えて

1

使用しているノードのバージョンによって、約束はネイティブでなければなりませんが...あなたが代わりにrequestrequest-promiseを使用することができ、その後、あなたは次のようになり

https://nodejs.org/en/blog/release/v4.0.0/

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

var request = require('request'); 

function getRequest(url) { 
    return new Promise(function (success, failure) { 
     request(url, function (error, response, body) { 
      if (!error && response.statusCode == 200) { 
       success(body); 
      } else { 
       failure(error); 
      } 
     }); 
    }); 
} 
getRequest('http://www.test.com/api1').then(function (body1) { 
    // do something with body1 
    return getRequest('http://www.test.com/api2'); 
}).then(function (body2) { 
    // do something with body2 
    return getRequest('http://www.test.com/api3'); 
}).then(function (body3) { 
    // do something with body3 
    //And so on... 
}); 
+0

良い例のおかげで!私は他のAPIでこれを実装することができました。しかし、私は私の約束関数に関数を渡す際に問題があります。多分あなたは見ることができますか? http://stackoverflow.com/questions/42349936/nodejs-functional-programming-no-access-to-prototype-in​​-handover-function – Til

1

使用async.series あなたは一連のURLに同じ操作を行いたい場合は他の人が示唆したように、async.map

を使用する約束も使用することができます。

あなたは、非同期プログラミングに慣れていない場合、私はあなたがより明確に理解を持っていたらPromise(またはcoroutinesasync/await)に移動し、その後asyncモジュールを開始することをお勧めします。

例:

var request = require('request'); 

async.series([ 
    function(callback) { 
    request('http://www.test.com/api1', function(error, response, body) { 
     if (!error && response.statusCode == 200) { 
     return callback(null, response); 
     } 
     return callback(error || new Error('Response non-200')); 
    } 
    }, 
    function(callback) { 
    request('http://www.test.com/api2', function(error, response, body) { 
     if (!error && response.statusCode == 200) { 
     return callback(null, response); 
     } 
     return callback(error || new Error('Response non-200')); 
    } 
    } 
], 
// optional callback 
function(err, results) { 
    if (err) { 
    // Handle or return error 
    } 
    // results is now array of responses 
}); 
0

すべての約束をつなぐことができます!

https://github.com/request/request-promise

var rp = require('request-promise'); 

rp(options) 
.then(function (body) { 
    return rp(...) 
}).then(()){ 
    ... 
} 

私の正直な意見ではと順序が重要でない場合は、並列にすべての要求を行う必要があります!

0

JavaScript Promisesを使用することをおすすめします。彼らは確実にmore beautifulコールバックを処理する方法を提供します。

関連する問題