2016-12-21 11 views
-3

を解決することはありません:。彼らはすべての要求を実行するために)getFromApi(と呼ばれるこの方法を使用Promise.all([..])、私は次のようになり、個々の約束の数持って

var performancePerMonth = new Promise(function(resolve, reject) { 
    var path = some_path; 
    getFromApi(path); 
}); 

を:

function getFromApi(path, callback) { 

    request({ 
    method: 'GET', 
    url: base_uri + path, 
    headers: { 'TOKEN': 'MY_ACCESS_TOKEN' } 
    }, 

    function (error, response, body) { 
    console.log('Status:', response.statusCode); 
    console.log('Headers:', JSON.stringify(response.headers)); 
    console.log('Response:', body); 
    return body; 
}); 

私は一緒にリクエストを実行し、すべての結果を含む配列を取得する必要があるため、私はPromise.allにすべての個々の約束を追加しました:

exports.perform = function(req, response) { 
    Promise.all([performancePerMonth, performancePerPlayer,..]).then(function(results) { 
    console.log('Then: ', results); 
    }).catch(function(err) { 
    console.log('ERROR Promise.all'); 
    console.log('Catch: ', err); 
    }) 
}; 

問題は、getFromApi()メソッドのログからわかるようにリクエストが正常に実行されても、結果の配列は返されません。どうやらメソッドが実行されますが.then内の関数になることはありませんし、この:

console.log('Then: ', results); 

が(その下のキャッチ機能もない)に達することはありません。

プログラムがすべての要求が実行され、結果を返すまで実行されないかのように見えます。

+0

あなたの機能ドン」のようなものが必要になる場合があり、

ので、エラーとして応答で返さ非2xxの状態を考慮していません約束を返すことも解決することもありません。 –

+1

最初のコードブロックでは、決意が解決されないように 'resolve()'を呼び出すことはありません。終了時に実際に 'resolve()'を呼び出すためには、非同期関数に接続する必要があります。プロミスには、非同期操作が完了したときに知るべき魔法の力が含まれていないので、 'resolve()'または 'reject()'を呼び出すことによってそれらを伝える必要があります。 – jfriend00

答えて

1

あなたは約束を決して決してしません。

var performancePerMonth = new Promise(function(resolve, reject) { 
    var path = some_path; 
    getFromApi(path, resolve); 
}); 

あなたgetFromApi機能もコールバックを持っていますが、それが実行されることは決してありません。おそらく、代わりにreturn body;

+1

'getFromApi()'は非同期です。これは動作しません。 – jfriend00

+0

ああ、それは見ていなかった。答えを編集する。 –

+0

いいえ、私はまだ同じことをします。 – ntonnelier

0

function getFromApi(path, callback)callback(body);は、コールバック引数は今少し呼び出すように変更され、その無名関数を使用することができます代わりに、匿名関数のrequestのためのコールバックとしてあなたが

function getFromApi(path, callback) { 
    request({ 
    method: 'GET', 
    url: base_uri + path, 
    headers: { 'TOKEN': 'MY_ACCESS_TOKEN' } 
    }, callback); 
} 

を持っていることを使用することができます受け入れたいです解決必要に応じて/拒否、performancePerMonthなど

var performancePerMonth = new Promise(function(resolve, reject) { 
    var path = some_path; 
    getFromApi(path, function (error, response, body) { 
     if (error) { 
      reject(error); 
     } else { 
      console.log('Status:', response.statusCode); 
      console.log('Headers:', JSON.stringify(response.headers)); 
      console.log('Response:', body); 
      resolve(body); 
     } 
    }); 
}); 

にあなたはresponse.statusCodeを確認したいことがあり、1つのそのインディカですTES成功した要求の前に盲目的にあまりにも体を解決する - 多くのリクエストAPIのあなたは

var performancePerMonth = new Promise(function(resolve, reject) { 
    var path = some_path; 
    getFromApi(path, function (error, response, body) { 
     if (error) { 
      reject(error); 
     } else { 
      console.log('Status:', response.statusCode); 
      console.log('Headers:', JSON.stringify(response.headers)); 
      console.log('Response:', body); 
      if (response.statusCode >= 200 && response.statusCode < 300) { 
       resolve(body); 
      } else { 
       reject(response.statusCode); 
      } 
     } 
    }); 
}); 
関連する問題