2017-04-04 63 views
1

所以,我有4項任務:getStatus()updateStatus(A)getTask()updateTask(),應該以這種方式執行:如何使用promise來執行串行任務?

getStatus(function(status) { 
    // A 
    updateStatus(status, function(status) { 
    // B 
    getTask(function(task) { 
     // C 
     updateTask(task, function(task) { 
     // D 
     }) 
    }) 
    }) 
}) 

所以爲了避免回調地獄,我使用的承諾,現在所有這四個任務返回無極,然後我把它改成這樣

getStatus().then(function(status) { 
    // A 
    updateStatus(status).then(function(status) { 
    // B 
    getTask().then(function(task) { 
     // C 
     updateTask(task).then(function(task) { 
     //D 
     }) 
    }) 
    }) 
}) 

正如你所看到的,它仍然有then hell

難道我做錯了以P romise?

回答

0

它應該是這樣的:

getStatus().then(function(status) { 
    // A 
    return updateStatus(status) 
}).then(function(status){ 
    return updateStatus(status) 
}).then(function(status) { 
    return getTask() 
}).then(function(task) { 
     // C 
    return updateTask(task) 
}).then(function(task) { 
    //D 
    return getStatus(); 
}).then(function(newStatus){ 
    // here you have newStatus returned by getStatus() in D 
}) 

而且也沒有回電地獄了;)

+0

如何獲得地位'getStatus'在'D'回? – Sato

+0

@Sato,這是額外的東西沒有問在問題中。提供了一系列解決方案[這裏](http://stackoverflow.com/questions/28250680/how-do-i-access-previous-promise-results-in-a-then-chain/)。你的嵌套方法可能是最好的解決方案。只記得添加一些回報。 –

+0

@Sato只需在'D'中返回它,它就可以在下一個'.then(function(status){/ * status available here * /})' –

5

如果您不需要在C和d使用status,這款採用.then會導致解析爲task一個承諾:

getStatus() 
    .then(updateStatus) 
    .then(() => getTask()) 
    .then(updateTask) 

還有async/await

const status = await getStatus(); 
await updateStatus(status); 

const task = await getTask(); 
await updateTask(task); 
0

如果您想獲取由D中getStatus返回的狀態。你可以像這樣

function getStatus (//here return promise) 
function updateStatus(//here return promise) 
function updateTask(//here return promise) 

Promise.all([ 
    getStatus(),updateStatus(),updateTask() 
]).spread(function(a, b,c) { 
    //here a = result of getStatus 
    //here b = result of updateStatus 
    //here c = result of updateTask 
}); 
+0

'Promise.all()'是一個promise集合器,不是函數調用者。 –

+0

根據要求減價,可以調用功能 – AJS