2016-07-01 72 views
2

我完全理解類似的問題之前已被問過,但我沒有得到它的運行。我需要一系列的承諾,我需要等到所有的承諾都解決了。

我的問題是,我需要的基礎上promise2promise4無論是$ translate.use結果調用基於另一個承諾的結果,不同的承諾:-(

所以OR$ translate.refresh

這是我迄今爲止(簡體):

 
 
     var promise1 = someService.get({}).$promise.then(function (result) { 
 
     // do stuff 
 
     }); 
 

 
     var promise2 = anotherService.getPromise().then(function (result) { 
 
     var properties = result[0]; 
 
     // do stuff 
 
     return properties; 
 
     }); 
 

 
     var promise3 = promise2.then(function(properties){ 
 

 
     // using $translate (angular-translate) here which is async as well 
 

 
     var userLanguage = properties.language; 
 
     if (userLanguage !== $translate.preferredLanguage()) { 
 
      // either this is the 4th promise 
 
      $translate.use(userLanguage).then(function (myVar) { 
 
      // ... 
 
      }); 
 
     } else { 
 
      // or this is the 4th promise 
 
      $translate.refresh().then(function (myVar) { 
 
      // ... 
 
      }); 
 
     } 
 
     }); 
 

 
     var loadPromises = { 
 
     promise1: promise1 
 
     promise2: promise2 
 
     promise3: promise3 
 
     promise4: ??? 
 
     }; 
 

 
     $q.all(loadPromises).then(function (result) { 
 
     // anything done 
 
     });

回答

4

你並不真的需要監視promise3promise4,所有你需要的是promise1promise2promise3成爲promise2的下一步。只要注意你是如何從promise2然後返回部分新希望(無論是return $translate.usereturn $translate.refresh):

var promise1 = someService.get({}).$promise.then(function(result) { 
    // do stuff 
}); 

var promise2 = anotherService.getPromise().then(function(result) { 
    var properties = result[0]; 
    // do stuff 
    return properties; 
}) 
.then(function(properties) { 

    // using $translate (angular-translate) here which is async as well 

    var userLanguage = properties.language; 
    if (userLanguage !== $translate.preferredLanguage()) { 
    // either this is the 4th promise 
    return $translate.use(userLanguage).then(function(myVar) { 
     // ... 
    }); 
    } else { 
    // or this is the 4th promise 
    return $translate.refresh().then(function(myVar) { 
     // ... 
    }); 
    } 
}); 

var loadPromises = { 
    promise1: promise1, 
    promise2: promise2 
}; 

$q.all(loadPromises).then(function(result) { 
    // anything done 
}); 
+0

這和OP中的邏輯不太一樣。的確,'promise3'被打破,'return'語句丟失,但'promise2'很好,可以保持原樣。這就可以獲得對「全部」承諾的承諾結果,如OP所示。 – Amit

+0

@Amit這是真的,我的代碼將不會在$ q.all塊中提供promise2結果,但是我的理解是OP不需要它,否則他們可能(?)不會將promise3鏈接到它。但是當然你是正確的,如果需要的話,它仍然很容易調整。 – dfsq

+0

如果這是需要,爲什麼最後一個'then'處理程序呢?代碼只是從前一個函數繼續到後一個,沒有return語句和額外的promise鏈。 – Amit

1

如果我理解你的代碼不夠好,我想你只需要返回的promise3內側的內部承諾。在您的示例中,在服務完成之前,promise1promise2都不會被解析。由於promise3取決於promise2它不會完成,直到promise2解決。我相信$q.all會一直持續下去,直到所有的承諾完成,甚至承諾由承諾返回。由於promise3返回承諾,promise3不會被視爲已解決,直到內部承諾得到解決。所以,我想增加幾條return語句就是你需要的全部:

var promise1 = someService.get({}).$promise.then(function (result) { 
    // do stuff 
    }); 

    var promise2 = anotherService.getPromise().then(function (result) { 
    var properties = result[0]; 
    // do stuff 
    return properties; 
    }); 

    var promise3 = promise2.then(function(properties){ 

    // using $translate (angular-translate) here which is async as well 

    var userLanguage = properties.language; 
    if (userLanguage !== $translate.preferredLanguage()) { 
     // either this is the 4th promise 
     //NOTE: added return here 
     return $translate.use(userLanguage).then(function (myVar) { 
     // ... 
     }); 
    } else { 
     // or this is the 4th promise 
     //NOTE: added return here 
     return $translate.refresh().then(function (myVar) { 
     // ... 
     }); 
    } 
    }); 

    var loadPromises = { 
    promise1: promise1, 
    promise2: promise2, 
    promise3: promise3 
    }; 

    $q.all(loadPromises).then(function (result) { 
    // anything done 
    });