2014-12-18 6 views
2

Можно ли вернуть что-либо из обещания notify callback?Можно ли вернуть значение из обещания, чтобы узнать обратный вызов?

В следующем коде ServiceB.Start возвращает отложенное обещание, где отложенное определяется на ServiceB:

ServiceB.Start(action).then(
     function() {console.log("Success");}, 
     function() {console.log("Failed");}, 
     function (notifyObject) { 
      var deferred = $q.defer(); 
      //do something time consuming 
      $timeout(function() { 
       if (notifyObject.success) { 
        deferred.resolve({ message: "This is great!" }); 
       } else { 
        deferred.reject({ message: "Really bad" }); 
       } 
      }, 5000); 
      console.log(notifyObject.message); 
      return deferred.promise; 
     } 
); 


var notifyReturnValue = ServiceB.deferred.notify(notifyObject); 
notifyReturnValue.then(
      function() { 
      //do something else 
      ServiceB.deferred.resolve(data); 
      } 
     ); 
    } 

notifyReturnValue кажется неопределенным. Есть ли способ вернуть что-то из deferred.notify()?

ответ

1

Да, вы можете вернуть значение от notify обратного вызова. Он работает аналогично возвращаемому значению от обратных вызовов успеха/ошибки. Возвращаемое значение передается на следующий обратный вызов notify. Однако, как указано в the documentation, вы не можете влиять на разрешение/отклонение от обратного вызова notify. Это имеет смысл, потому что notify можно назвать несколько раз, в то время как обещание может быть разрешено/отклонено только один раз.

Когда вы позвоните, then, вы получите новый Promise. Это потому, что это средство цепочки асинхронные действия. Новое обещание разрешается, когда разрешены не только исходное действие, но и обратные вызовы, переданные в then (которые могут быть асинхронными).

See this demo передачи значений уведомлений (при открытой консоли).

+0

Отложенный запрос. Я вызываю внутри уведомления - это локальная отсрочка, определенная внутри самого уведомления, а не та, на которую вызывается уведомление. И именно это местное отложенное. Я пытаюсь вернуться назад. Но угадайте, что я пытаюсь сделать, не буду работать, поскольку возвращаемое значение будет передано следующему уведомляемому обратному вызову только в строке. Я мог бы объединить все свои обещания. Однако я пытался инкапсулировать обязанности к различным контроллерам, а не смешивать их. –

+0

Канал уведомлений - это просто способ уведомления слушателя о прогрессе действия. Его нельзя использовать ни для чего другого. Используйте другие шаблоны (например, события) для другого взаимодействия между вашими компонентами. – hon2a