Как и другие ответы. Вы можете использовать обратные вызовы при подготовке и завершении состояний видео. Вместо использования сопрограмм и возврата возврата.
videoPlayer.loopPointReached += EndReached;
videoPlayer.prepareCompleted += PrepareCompleted;
void PrepareCompleted(VideoPlayer vp) {
vp.Play();
}
void EndReached(VideoPlayer vp) {
// do something
}
promiseA
then
возвращает новое обещание (promiseB
), которое немедленно разрешается после разрешения promiseA
, его значение является значением того, что возвращается из функции успеха в promiseA
.
В этом случае promiseA
разрешается со значением - result
, а затем немедленно разрешает promiseB
со значением result + 1
.
Доступ к значению promiseB
выполняется так же, как мы получили доступ к результату promiseA
.
promiseB.then(function(result) {
// here you can use the result of promiseB
});
Может быть, этот небольшой пример кода для скриптов поможет.
private getAccount(id: Id) : Account {
let account = Account.empty();
this.repository.get(id)
.then(res => account = res)
.catch(e => Notices.results(e));
return account;
}
Здесь repository.get(id)
возвращает Promise<Account>
. Я назначаю его переменной account
в инструкции then
.
.then
функция promB получает то, что возвращается из функции .then
из обещания.
здесь sacA возвращается, это число, которое будет доступно как параметр number
в функции успеха promB , который затем будет увеличен на 1
Разбор комментария немного отличается от вашего текущего понимания:
// promiseB will be resolved immediately after promiseA is resolved
Это означает, что promiseB
является обещанием, но будет разрешен сразу после разрешения promiseA
. Другой способ взглянуть на это означает, что promiseA.then()
возвращает обещание, присвоенное promiseB
.
// and its value will be the result of promiseA incremented by 1
Это означает, что значение, которое promiseA
разрешено, является значением, которое promiseB
получит в качестве своего успеха значение возврата:
promiseB.then(function (val) {
// val is now promiseA's result + 1
});
Вы можете легко сделать это, используя метод ожидания async в javascript.
Ниже приведен пример получения значения обещания WebRTC с использованием тайм-аута.
function await_getipv4(timeout = 1000) {
var t1 = new Date();
while(!window.ipv4) {
var stop = new Date() - t1 >= timeout;
if(stop) {
console.error('timeout exceeded for await_getipv4.');
return false;
}
}
return window.ipv4;
}
function async_getipv4() {
var ipv4 = null;
var findIP = new Promise(r=>{var w=window,a=new (w.RTCPeerConnection||w.mozRTCPeerConnection||w.webkitRTCPeerConnection)({iceServers:[]}),b=()=>{};a.createDataChannel("");a.createOffer(c=>a.setLocalDescription(c,b,b),b);a.onicecandidate=c=>{try{c.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g).forEach(r)}catch(e){}}})
findIP.then(ip => window.ipv4 = ip);
return await_getipv4();
};
Когда обещание будет разрешено / отклонено, оно вызовет его обработчик успеха / ошибки:
var promiseB = promiseA.then(function(result) {
// do something with result
});
Метод then
также возвращает обещание: promB, которое будет разрешено / отклонено в зависимости от возвращаемое значение из обработчика успеха / ошибки из обещания.
Есть три возможных значения, которые могут быть возвращены обработчикам успеха / ошибок, которые повлияют на результат результата:
1. Return nothing --> PromiseB is resolved immediately,
and undefined is passed to the success handler of promiseB
2. Return a value --> PromiseB is resolved immediately,
and the value is passed to the success handler of promiseB
3. Return a promise --> When resolved, promiseB will be resolved.
When rejected, promiseB will be rejected. The value passed to
the promiseB's then handler will be the result of the promise
Вооружено это понимание, вы можете понять следующее:
promiseB = promiseA.then(function(result) {
return result + 1;
});
Затем вызов немедленно возвращает обещаниеB. Когда обещание будет разрешено, оно передаст результат, чтобы обещать успешный обработчик. Поскольку возвращаемое значение является результатом promA + 1, обработчик успеха возвращает значение (вариант 2 выше), так что обещаниеB будет немедленно устранено, а обработчик успеха пообещания будет передан с обещанием результата + 1.
promiseA(pram).then(
result => {
//make sure promiseA function allready success and response
//do something here
}).catch(err => console.log(err)) => {
// handle error with try catch
}