我不知道這是可能的,但這是我想要做的。我打電話給一個返回承諾的數據庫。在then
我想遍歷結果併爲每行創建一個新的承諾來發出HTTP請求。它執行所有HTTP請求,但我無法爲每個請求鏈接一個then。這是我曾嘗試:產卵多重承諾
嘗試1
userDao.getBitbucketInfoForUser(token.id, cohortId)
// Get Bitbucket information and make clones
.then((teams) => {
for(const team of teams) {
console.log('Clone repo ' + sourceRepo + ' for Team-' + team.teamNumber);
return makeFork(gitInfo, sourceRepo, team);
}
})
.then((result) => {
const team = result.team;
console.log('Wait for Team ' + team + ' repo');
})
.catch((error) => {
console.log(error);
response.status(error.status).json(error).end()
});
我馬上意識到,這是愚蠢的,因爲我回來,打破了我的循環。所以我去了這一點:
嘗試2
userDao.getBitbucketInfoForUser(token.id, cohortId)
// Get Bitbucket information and make clones
.then((teams) => {
for(const team of teams) {
console.log('Clone repo ' + sourceRepo + ' for Team-' + team.teamNumber);
makeFork(gitInfo, sourceRepo, team)
.then((result) => Promise.resolve(result));
}
})
.then((result) => {
const team = result.team;
console.log('Wait for Team ' + team + ' repo');
})
.catch((error) => {
console.log(error);
response.status(error.status).json(error).end()
});
這次經歷並取得所有的呼叫在makeFork
但只跑了一次then
。接下來,我想這:
嘗試3
userDao.getBitbucketInfoForUser(token.id, cohortId)
// Get Bitbucket information and make clones
.then((teams) => {
for(const team of teams) {
console.log('Clone repo ' + sourceRepo + ' for Team-' + team.teamNumber);
new Promise((resolve, reject) => resolve(makeFork(gitInfo, sourceRepo, team)));
}
})
.then((result) => {
const team = result.team;
console.log('Wait for Team ' + result + ' repo');
})
.catch((error) => {
console.log(error);
response.status(error.status).json(error).end()
});
這導致了完全相同的行爲,嘗試2.有沒有辦法做我想要什麼?
如何承諾所有? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all – Kosch
我看到了,但它並不像我想要的東西。它需要一些有意義的東西,並且一旦它們全部解決,就會調用它。我可能需要這一點,但不是我想要對每個HTTP調用採取行動。 – CaseyB