У меня есть функция, которая должна сделать что-то асинхронное за несколько шагов. На каждом шагу он может дать сбой. Он может выйти из строя до шага 1, поэтому вы можете узнать результат сразу или через 1,5 секунды. Когда происходит сбой, он должен выполнить обратный вызов. То же самое, когда это удается. (Я использую когда намеренно, потому что это не просто если: важно время.)
Я думал, что промисы идеальны, потому что они асинхронны и разрешаются только один раз, но у них все еще есть проблема: когда они терпят неудачу? Я могу явно видеть, когда это удается (после последнего шага), но когда это терпит неудачу? Внутри/перед любым шагом.
Вот что у меня есть сейчас, но это смешно:
function clickSpeed() {
return new Promise(function(resolve, reject) {
if ( test('one') ) {
return setTimeout(function() {
if ( test('two') ) {
return setTimeout(function() {
if ( test('three') ) {
return setTimeout(function() {
console.log('resolving...');
resolve();
}, 500);
}
console.log('rejecting...');
reject();
}, 500);
}
console.log('rejecting...');
reject();
}, 500);
}
console.log('rejecting...');
reject();
});
}
(test()
случайным образом проходит или не проходит шаг.)
Скрипка здесь: http://jsfiddle.net/rudiedirkx/zhdrjjx1/
Я предполагаю, что решение состоит в том, чтобы связать обещания, которые разрешают или отклоняют каждый шаг..? Может быть. Это вещь? Как бы я это реализовал?
Может ли это работать для неизвестного количества шагов?
return
вreturn setTimeout(function() {
? - person guest271314   schedule 23.11.2015return
здесь только для того, чтобы предотвратить запускconsole.log('rejecting...'); reject();
- person Bergi   schedule 23.11.2015promise.then(function(res, reject) { res('step1') or reject('err')}).then(function(res) { res('step2')}).catch(function(err) { console.log(err) })
- person Errorpro   schedule 23.11.2015test
не отклоняет обещание ? Как будет вызыватьсяreject
на основе возвращаемого значенияtest
, еслиsetTimeout
прерывает поток? - person guest271314   schedule 23.11.2015test()
возвращает только логическое значение. Это может быть не функция, а оператор или проверка другого объекта/свойства. Отклонение происходит после каждого IF. - person Rudie   schedule 23.11.2015test()
возвращает логическое значение, но случайное значение предназначено только для тестирования. Он берет что угодно откуда угодно, что может отклонить обещание или продвинуть его к следующему шагу. Проверкаtest()
не всегда является функцией и не знает об обещаниях. - person Rudie   schedule 23.11.2015