我試圖從異步任務中返回承諾,以便我可以使用。然後()調用使它們同步。不幸的是,我正在經歷一些真正奇怪的行爲。基本上,第二個then()在第二個解決之前執行。有人可以解釋發生了什麼嗎?這裏是我的代碼:爲什麼.then()在promise實際解決之前觸發?
function runReleaseLoop() {
console.log('Starting release loop');
const themes = ['blue', 'red'];
return new Promise(resolve => {
buildReleases(themes, resolve);
})
}
function buildReleases(themes, onComplete) {
console.log(themes);
if (themes.length === 0) {
onComplete();
} else {
const theme = themes.pop();
Promise.resolve()
.then(setTheme(theme))
.then(someDelayedTask(theme))
.then(buildReleases(themes, onComplete));
}
}
function setTheme(theme) {
return new Promise(resolve => {
console.log(`Setting theme to ${theme}`);
resolve();
});
}
function someDelayedTask(theme) {
console.log(`Starting delayed task related to ${theme}`);
return new Promise(resolve => {
setTimeout(() => {
console.log(`Finished delayed task related to ${theme}`);
resolve();
}, 3000)
});
}
// Run the process
runReleaseLoop()
.then(() => {
console.log('Release loop finished')
});
這裏是我的控制檯輸出:
"Starting release loop"
["blue", "red"]
"Setting theme to red"
"Starting delayed task related to red"
["blue"]
"Setting theme to blue"
"Starting delayed task related to blue"
[]
"Release loop finished"
"Finished delayed task related to red"
"Finished delayed task related to blue"
因此,對於帶參數的,我需要返回,返回一個承諾函數的功能是什麼? – ordanj
是的正確(哎呀刪除第一個評論大聲笑),但你也需要採取行動的承諾,返回,等 – Deryck