2016-10-24 72 views
3

我有8個回調,相互依賴。我的想法 是有一個更可讀的過程,但我不明白如何處理這個。Nodejs:處理多個Promise回調(回調地獄)

我的回調地獄的一個例子是:

return new Promise(function (resolve, reject) { 
client.command("Command") 
    .then(function() { 
    client.command(command1) 
    .then(function() { 
    client.command(command2) 
     .then(function() { 
     client.command(command3) 
     .then(function() { 
     client.command(command4) 
      .then(function() { 
      client.command(command5) 
      .then(function() { 
      client.command(command6) 
       .then(function() { 
       client.command(command7) 
       .then(function() { 
       client.command(issue) 
        .then(function() { 
        client.command(command8) 
        .then(function (result) { 
        resolve(result.substring(0, 6)); 
        }); 
        }); 
       }); 
       }); 
      }); 
      }); 
     }); 
     }); 
    }); 
    }); 
}); 

任何人知道如何解決這個問題?

+0

的可能欺騙https://stackoverflow.com/questions/22539815/arent-promises-just-callbacks – JohnnyHK

回答

5

您可以通過返回各自的承諾,例如拉平這個三角形出:

return new Promise(function(resolve, reject) { 
    client.command('Command') 
     .then(function() { 
      return client.command(command1); 
     }).then(function() { 
      return client.command(command2); 
     }).then(function(result) { 
      resolve(result.substring(0, 6)); 
     }); 
}); 

編輯:您可以創建您的所有承諾的數組,並調用Promise.each,陣列上,也是如此。

+1

這對我來說很有意義。謝謝! –

1

我假定client.command返回一個承諾。然後做:

return client.command("Command") 
    .then(function (resultOfCommand) { 
    return client.command(command1) 
    }) 
    .then(function (resultOfCommmand1) { 
    return client.command(command2) 
    }) 

您也可以使用q

const q = require('q') 
return q.async(function *() { 
    yield client.command('Command') 
    yield client.command(command1) 
    ... 
    return client.command(command8) 
})()