2017-06-23 15 views
2

現在、nodejsアプリで作業しています。その一部は、いくつかのapi呼び出しをテストしてから約束を返し、別の機能を実行します。nodejsで約束していない約束

ので - 私は、次の二つの機能を持つ約束の配列をループしています:個々の配列のためのすべてのAPIのためのすべての機能を超える

function testAllApis(apiList, counter = 0){ 
    return new Promise(function(fulfill, reject){ 
    console.log(counter); 
    if(counter == apiList.length){ 
     console.log('test1'); 
     fulfill(); 
     console.log('test2'); 
    } 
    else { 
     testSingleApi(apiList[counter]).then(() => { 
     testAllApis(apiList, counter + 1); 
     }).catch((e) => { 
     console.log(e); 
     reject(e); 
     testAllApis(apiList, counter + 1); 
     }) 
    } 
    }) 
} 

機能

function testSingleApi(thisApi){ 
    return new Promise(function(fulfill, reject){ 
    var apiUrl = '/api/' + thisApi.substr(7).slice(0, -3) + '/testapi/'; 
    var options = { 
     hostname: serverHost, 
     port: serverPort, 
     path: apiUrl, 
     method: 'GET', 
    }; 
    var req = http.request(options, (res) => { 
     console.log(res.statusCode); 
     fulfill(res.statusCode); 
    }); 
    req.on('error', (e) => { 
     reject(e.message); 
    }); 
    req.end(); 
    }); 
} 

端末でこれを呼び出すと、意図したとおりに機能します。コンソールは、私が作っているapi呼び出しの成功コード(200)を記録しますが、第3のものの後に、 'counter'が配列の長さと等しい場合、testAllApis関数のif条件に入り、 test1 '、次に' test2 'を実行してもまったく成立しません。

これについての洞察はありますか?私はまだ約束を新しくしていて、このオンラインの解決策を模索しようとしましたが、かなりの特定の質問だったので、代わりにここに投稿すると考えました。

+0

return testAllApis(apiList、counter + 1); –

+0

'return testAllApis(apiList、counter + 1);'を意味しませんか?さもなければ、それは完了するまで待つことはありませんか? –

+0

ありがとう。私はこれを試して、悲しいことにそれはまだ私を助けていない。しかし、このベストプラクティスですか?私はこれを将来確実に行うつもりです。 –

答えて

1

順次約束を実行するためにreduceを使用する方が簡単です:

var funcs = apiList.map((api) => testSingleApi(api)); 

var promiseSerial = (funcs) => 
    funcs.reduce((promise, func) => 
    promise.then(result = func().then(Array.prototype.concat.bind(result))), 
    Promise.resolve([])); 

promiseSerial(promises) 
    .then(...) 
    .catch(...); 
+0

フィードバックをいただきありがとうございます、私はすぐにこれを行って、役立つかどうかを確認します! –

+0

申し訳ありませんが、あなたに戻って時間がかかりました。私はこれにかなり近いソリューションを使用して修正を終了したので、ありがとう! –

+0

@ jock.perkinsお手伝いをしてうれしい! :) –

0

あなたは再帰を避けるために、あなたは非同期/のawait使用している場合は、よりクリーンで管理しやすいコードを取得することができます。

あなたのノードが非同期/のawaitサポートしている場合、あなたはあなたにこのようなロジックにリファクタリングすることができます:あなたのノードが非同期/のawaitサポートしていない場合、あなたはnsynjs moduleを使用して、このようにコードを変更することができます

async function testAllApis(apiList){ 
    for(var i=0; i<apiList.length; i++) 
     console.log(await testSingleApi(apiList[i])); 
} 

testAllApis(apiList).then(function(){ 
    console.log("all done at this point") 
}); 

を:

nsynjs = require('nsynjs'); 
... 

function testAllApis(apiList, testSingleApi){ 
    for(var i=0; i<apiList.length; i++) 
     console.log(testSingleApi(apiList[i]).data); 
} 

nsynjs.run(testAllApis,{},apiList,testSingleApi,function(){ 
    console.log("all done at this point"); 
})