2017-04-04 33 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