Не разрешается, потому что nextFunc()
в конечном итоге вызывает обратный вызов, переданный thirdParty()
внутри первого обещания, и снова вызывает resolve()
для этого обещания, которое уже выполнено, поэтому ничего не делает. Между тем, вы никогда не вызываете resolve()
для второго обещания, поэтому оно никогда не решается.
Вот лучший подход единственный подход, который я могу придумать, учитывая ограничения вашего стороннего API (с ужасным дизайном интерфейса, на мой взгляд):
// Third party function, I cannot control
function thirdParty(callback) {
var number = 0;
var inner = function() {
setTimeout(function() {
next = inner;
number = number + 10;
callback(number, next);
}, 1000);
};
inner();
}
// Code I can control
const numbers = getNumbers();
// Calls third party api
async function* getNumbers() {
let resolve, next;
yield new Promise(_resolve => {
resolve = _resolve;
thirdParty((number, _next) => {
console.log(number);
resolve(number);
next = _next;
});
});
while (true) {
yield new Promise(_resolve => {
resolve = _resolve;
next();
});
}
}
document.querySelector('button').addEventListener('click', () => {
numbers.next().then(({ value }) => {
document.getElementById('ele').innerHTML += value + '<br>';
});
});
<p>
<button type="button">Get Numbers</button>
</p>
<p id="ele"></p>