如何使用promise来执行串行任务?
问题描述:
所以,我有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?
答
它应该是这样的:
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)
还有async/await:
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
});
+0
'Promise.all()'是一个promise集合器,不是函数调用者。 –
+0
根据要求减价,可以调用功能 – AJS
如何获得地位'getStatus'在'D'回? – Sato
@Sato,这是额外的东西没有问在问题中。提供了一系列解决方案[这里](http://*.com/questions/28250680/how-do-i-access-previous-promise-results-in-a-then-chain/)。你的嵌套方法可能是最好的解决方案。只记得添加一些回报。 –
@Sato只需在'D'中返回它,它就可以在下一个'.then(function(status){/ * status available here * /})' –