2016-07-01 6 views
2

Я полностью понимаю, что подобные вопросы заданы раньше, но я не запускаю его. Мне нужна цепочка обещаний, и мне нужно подождать, пока все обещания не будут решены.

Моя проблема заключается в том, что мне нужно вызвать различные обещания, основанные на результатах другого обещания :-(

Так на основе результатов promise2 мой promise4 является ЯВНО$ translate.useИЛИ это $ 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

Вам не нужно следить за promise3 и promise4, все, что вам нужно, это promise1 и promise2. promise3 становится следующим шагом promise2. Просто обратите внимание, как вы возвращаете новое обещание (либо return $translate.use или return $translate.refresh) из promise2 затем части:

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. Это правда, что 'обещание3' было сломано, а' return' были отсутствуют, но 'обещание2' было в порядке и может храниться как есть. Это даст доступ к результату этого обещания «всем», как в OP. – Amit

+0

@Amit Это правда, что этот мой код не будет иметь результат prom2, доступный в блоке $ q.all, однако я понимаю, что OP действительно не нуждается в этом, иначе они, вероятно, (?) Не свяжутся с ним2. Но, конечно, вы правы, и если это необходимо, тогда его легко настроить. – dfsq

+0

Если это необходимо, почему у этого последнего обработчика 'then' вообще? Код просто продолжается от прежней функции до последней, без оператора return и дополнительной цепочки обещаний. – Amit

1

Если я понимаю ваш код достаточно хорошо, я думаю, вам нужно только, чтобы вернуть внутреннее обещание внутри promise3. В вашем примере оба promise1 и promise2 не будут разрешены до тех пор, пока услуга не будет завершена. С 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 
    });