可读的承诺逻辑流程

时间:2015-08-25 22:39:52

标签: javascript angularjs promise

我试图找出使用模态和http请求构造Promise逻辑的最佳实践。说我有这样的情况:

// normal logic flowing to here
// ...
// encounter special case

if (needToDoSomeGuidedPreprocessing) {
    doSomeAsyncHttpCall
    .then(doSomeStuff);
    .then(sendUpSomeDialogThatNeedsToConfirmToProceed)
}

// ...
// if dont need guided preprocessing, continue to normal operations 
// (includes more dialogs). Also, if guided preprocessing worked, make sure
// code down here doesn't fire until pre-processing is done (i.e. all these
// operations need to be done sequentially, so .all( ) wont work

如何才能让我的代码在这里可读?

我想到了这个,但想到也许有更好的方法?问题是在此之后我还有更多的异步方法/对话框,并且宁愿保留一个单一的方法而不是跳出一个全新的方法。:

// ...
// encounter special case

if (needToDoSomeGuidedPreprocessing) {
    doSomeAsyncHttpCall
    .then(doSomeStuff);
    .then(sendUpSomeDialogThatNeedsToConfirmToProceed)
    .then(callSomeCommonMethod)
}
else{
  callSomeCommonMethod()
}

// ...

这只是对话/异步操作的本质还是我做错了什么?

1 个答案:

答案 0 :(得分:1)

如果您的操作可能异步,则应始终将其视为与外界异步,即使在某些(甚至是大多数)条件下它也是同步的。

因此,要实现这一点,函数应该返回一个promise。

除此之外,.then链接提供了您需要的顺序处理。否则,您的代码非常易读。

function doSomething(){

  var promise = $q.resolve();

  if (needToDoSomeGuidedPreprocessing){
    promise = promise.then(doSomeAsyncHttpCall)
                     .then(doSomeStuff)
                     .then(sendUpSomeDialogThatNeedsToConfirmToProceed)
  }

  promise = promise.then(callSomeCommonMethod);

  // etc...

  return promise;
}