如何使用promise做序列任务?

时间:2017-04-04 03:29:01

标签: javascript node.js promise bluebird

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

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

所以为了避免回调地狱,我用了承诺,现在所有这四个任务都返回了一个Promise,然后我把它改成了这种方式

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做错了吗?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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
})

再也没有回电地狱了;)

答案 2 :(得分:0)

如果你想获得getStatus在D中返回的状态。你可以这样做

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