我知道有類似的問題,但我沒有看到這個鏈接模式的任何地址。如何破解承諾鏈?
我有以下幾點:
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
,但問題。
選項我考慮:
- 提出一些全局標誌,只是阻止進一步執行從鏈中。 Yuck,因爲鏈條還在繼續,它只是被清空。
throw new Error(result)
而不是return result
。這將打破連鎖(我認爲...),但它被誤用,並且很容易被其他開發者誤解。
我怎樣才能打破這條鏈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
即使成功也會被打電話,但是當我經過時,拒絕不會被調用。就好像到了我得到結果的時候,鏈中的所有鏈接都被調用了。
你是否也看到了(這些)(https://開頭stackoverflow.com/q/28803287/1048572)[很少](https://stackoverflow.com/q/21576862/1048572)[問題](https://stackoverflow.com/q/29499582/1048572)? – Bergi
重新更新2:不確定爲什麼你會拒絕承諾。你確定'streamToDom'調用之一確實返回一個真實結果,並且'runMoreTests'不總是被調用嗎?你可以做一些調試,或者將'console.log(result)'的輸出發佈到該回調中? – Bergi
@Bergi我看到'return runMoreTests()'多次被調用,然後是'return result',然後'return runMoreTests()'多次被調用,直到拒絕被調用。 – SB2055