如何使用诺言来做串行任务?
所以我有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 });