Я знаю, что есть похожие вопросы, но я не видел ни одного, касающегося этого шаблона цепочки.
У меня есть следующее:
var runTests = function (chain, resolutionTest) {
return chain.then(function (result) {
if (result)
return result; // Early return if the previous tests were successful. This is where I want to prevent other attempts.
const attempt = tryOpenStream(resolutionTest).then(streamToDom);
return attempt;
});
}
// from someplace else
numTests = resolutionTests.length;
return resolutionTests.reduce(runTests, Promise.resolve()); // start reduce with an empty promise
Проблема, с которой я столкнулся, заключается в том, что я звоню tryOpenStream
много раз даже после того, как захватил result
.
Варианты, которые я рассматриваю:
- Поднимите какой-нибудь глобальный флаг, который просто предотвращает дальнейшее выполнение внутри цепочки. Фу, потому что цепочка все еще продолжается, она просто опустела.
throw new Error(result)
вместоreturn result
. Это разорвет цепочку (я думаю...), но это неправильное использованиеError
и будет легко неправильно понято другим разработчиком.
Как мне разорвать эту цепочку на return result;
?
ОБНОВЛЕНИЕ 1
Я пытаюсь сделать следующее:
var makeTest = function (runMoreTests, resolutionTest) {
return function runTest() {
return tryOpenStream(resolutionTest).then(streamToDom).then(function (result) {
if (result)
return result;
else
return runMoreTests();
});
};
}
return resolutionTestBuilder.buildTests().then(function (resolutionTests) {
numTests = resolutionTests.length;
return resolutionTests.reduceRight(makeTest, function () { Promise.reject("No resolutions succeeded.") })();
});
Однако вызовы runTest
не вызываются. Это немного новый синтаксис для меня, поэтому я изучу некоторые и обновлю любые выводы.
ОБНОВЛЕНИЕ 2
Мне не хватало ()
, чтобы вызвать reduceRight
. Хотя теперь я вижу, что reject
вызывается даже с успехом... хотя, когда я прохожу, этот отказ не вызывается. Как будто к тому времени, когда я получаю результат, все звенья в цепочке уже задействованы.
streamToDom
возвращает верный результат, аrunMoreTests
не всегда вызывается? Можете ли вы выполнить некоторую отладку или опубликовать выводconsole.log(result)
, введенного в этот обратный вызов? - person Bergi   schedule 20.06.2017return runMoreTests()
вызывается несколько раз, затемreturn result
, затемreturn runMoreTests()
еще много раз, пока не будет вызвано отклонение. - person SB2055   schedule 20.06.2017return result
больше ничего запускать не надо. Вы используете правильную реализацию обещания, которая никогда не вызываетthen
обратных вызовов несколько раз, верно? Я не могу представить себе другую причину. - person Bergi   schedule 20.06.2017