如何使用诺言来做串行任务?

所以我有4个任务: getStatus()updateStatus(A)getTask()updateTask() ,它应该以这种方式执行:

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

所以为了避免callback地狱,我用诺言,现在所有这四个任务都返回一个诺言,然后我改变了这个方式

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

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

我对Promise做错了什么?

它应该是这样的:

 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 }) 

而且再也没有回电话了)

如果您不需要在C和D中使用status ,则使用.then将导致解决task的承诺:

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

还有asynchronous/等待 :

 const status = await getStatus(); await updateStatus(status); const task = await getTask(); await updateTask(task); 

如果你想获得由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 });