2017-11-10 8 views
0

具体的には、データのリストがあれば、そのリストをループして、後ですべてを結合する前にそのデータの各要素をフェッチします。つまり、書かれているように、コードはすぐにすべての操作を開始して、リスト全体をただちに反復処理します。その後、フェッチ操作が実行されていても、データが処理される前に、その呼び出しが実行された後に呼び出されます。約束事の後にコールバックを実行するにはどうしたらいいですか?

Promisesを配列に入れて、その配列をPromise.all()呼び出しに引き渡し、次にそれを指定して処理したすべてのデータにアクセスしますが、私はそうではありません私はこのforループの中にPromisesを入れ子にしているので、このケースでどうやってそれをやっているか確かめてください。あなたは、アレイ内のすべての項目のための非同期操作を実行する必要がある場合

 for(var i in repoData) { 
      var repoName = repoData[i].name; 
      var repoUrl = repoData[i].url; 
      (function(name, url) { 
       Promise.all([fetch(`https://api.github.com/repos/${username}/${repoData[i].name}/commits`), 
        fetch(`https://api.github.com/repos/${username}/${repoData[i].name}/pulls`)]) 
       .then(function(results) { 
        Promise.all([results[0].json(), results[1].json()]) 
        .then(function(json) { 
         //console.log(json[0]); 
         var commits = json[0]; 
         var pulls = json[1]; 
         var repo = {}; 
         repo.name = name; 
         repo.url = url; 
         repo.commitCount = commits.length; 
         repo.pullRequestCount = pulls.length; 
         console.log(repo); 
         user.repositories.push(repo); 
        }); 
       }); 
      })(repoName, repoUrl); 
     } 
    }).then(function() { 
     var payload = new Object(); 
     payload.user = user; 
     //console.log(payload); 
     //console.log(repoData[0]); 
     res.send(payload); 
    }); 
+0

これは、あなたが約束を使用する方法ではありません。 .. –

+0

質問は完了しましたか?最後に '.then()'と連鎖されるのは何ですか? – guest271314

答えて

4

は一般的に、答えはPromise.all(arr.map(...))を使用することであり、この場合も例外はないように思われます。

はまた、あなたは、次のthen(またはすべてを集約Promise.allへ)に上の値を渡すためにあなたのthenコールバックでreturn値に必要なことを覚えておいてください。

複雑な状況に直面すると、小さなものに分解することができます。この場合、コードを分離して、単一レポのデータを独自の機能にクエリすることができます。あなたがいることをやった後は、それらのすべてはつまるところためのデータを照会するためのコード:

Promise.all(repoData.map(function (repoItem) { 
    return getDataForRepo(username, repoItem); 
})) 

は、次のことを試してください:

// function to query details for a single repo 
function getDataForRepo(username, repoInfo) { 
    return Promise 
    .all([ 
     fetch(`https://api.github.com/repos/${username}/${repoInfo.name}/commits`), 
     fetch(`https://api.github.com/repos/${username}/${repoInfo.name}/pulls`) 
    ]) 
    .then(function (results) { 
     return Promise.all([results[0].json(), results[1].json()]) 
    }) 
    .then(function (json) { 
     var commits = json[0]; 
     var pulls = json[1]; 

     var repo = { 
     name: repoInfo.name, 
     url: repoInfo.url, 
     commitCount: commits.length, 
     pullRequestCount: pulls.length 
     }; 

     console.log(repo); 
     return repo; 
    }); 
} 

Promise.all(repoData.map(function (repoItem) { 
    return getDataForRepo(username, repoItem); 
})).then(function (retrievedRepoData) { 
    console.log(retrievedRepoData); 

    var payload = new Object(); 
    payload.user = user; 
    //console.log(payload); 
    //console.log(repoData[0]); 
    res.send(payload); 
}); 
関連する問題