Итак, мое понимание обещаний заставило меня поверить, что мои другие обещания будут проходить один за другим в моей тогдашней цепочке, но я делаю что-то неправильно здесь.Обещание не дожидаясь друг друга
код, я использую в настоящее время выглядит следующим образом
const mainPromise =() => Promise.resolve(
console.log('spinner spinning...')
...spinner code.... //this is omitted code
);
const getData =() => Promise.resolve(
someObj.getProducts('data.json')
);
const updateProduct =() => Promise.resolve(
setTimeout(()=>{
someObj.updateProductHTML()
}, 0)
);
const updateDom =() => {
setTimeout(()=>{
someObj.updateDOM()
}, 0)
};
и мое обещание цепи
mainPromise()
.then(getData)
.then(updateProduct)
.then(updateDom)
;
Они, кажется, изначально работает в порядке, но Ajax позвонить я имею в getProducts также рабочий цикл для построения моего массива объектов и заканчивается после того, как все мои .thens запускаются.
Я пытаюсь по крайней мере, мой вызов данных и закончить до того, работник updateProduct и updateDOM работает
--- UPDATE ---
ИТАК с пересмотренным обещаний, установленных в качестве таковых в соответствии с предложениями в комментариях и ответе Samanime в
const mainPromise =() => Promise.resolve(
console.log('spinner spinning...')
);
const getData =() => new Promise(resolve => {
console.log('getData');
someObj.getProducts('data.json');
resolve();
}
);
const updateProduct =() => new Promise(resolve =>{
console.log('updateProduct');
someObj.updateProductHTML();
resolve();
});
//execute promise chain
mainPromise()
.then(getData)
.then(updateProduct)
.then(page.updateDOM)
;
Я обновил обещание не сразу решить и пытаю назвать решительность после того, как я называю свои функции (хотя я по себе, чтобы, если решимости будет вызываться до или после того, как этот фунца ионов).
К сожалению, я по-прежнему получаю то же поведение. Я добавил консольные журналы своих функций, а также мои обещания, и я не получаю этот список назад
log.spinner spinning
log.getData
log.updateProduct
log.A log from the function updateProduct calls
log.48 product objects created (for loop worker in my getProducts function)
log.Data retrieved and assigned
the last two logs would ideally be called after getData
Ни один из вызовов или функций за пределами тех, предусмотренных являются возвратные обещания, я воздействую на наследство кода, и я отхожу от трюка setTimeout, а также мои результаты не были согласованы.
--update 2 -
Проблема у меня известен как Разветвляющихся/Расщепление. Мне просто нужно выяснить цепочку, чтобы исправить мою проблему.
- ЗАВЕРШЕНИЕ -
это то, что я в конечном итоге разработка
// execute promise chain
mainPromise()
.then(getData);
//the timeout is a little hack to ensure the sequence is kept
mainPromise()
.then(() => {
setTimeout(() => {
myObj.updateProductHTML();
myObj.updateDOM();
}, 0);
});
, по-видимому .then(foo).then(bar)
просто работает Foo и бар, в то же время
, кажется, работает нормально, но верно Я чувствую, что что-то не так.
Попытайтесь вернуть Promise.resolve (...) –
Формат, который он использует, возвращает разрешение. – samanime
Почему вы (думаете, что вам) нужны эти 'Promise.resolve' звонки? Разве прядильщик, 'getProducts' и методы обновления не возвращают обещания сами по себе? – Bergi