2016-11-01 11 views
0

Итак, мое понимание обещаний заставило меня поверить, что мои другие обещания будут проходить один за другим в моей тогдашней цепочке, но я делаю что-то неправильно здесь.Обещание не дожидаясь друг друга

код, я использую в настоящее время выглядит следующим образом

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 и бар, в то же время

, кажется, работает нормально, но верно Я чувствую, что что-то не так.

+1

Попытайтесь вернуть Promise.resolve (...) –

+1

Формат, который он использует, возвращает разрешение. – samanime

+0

Почему вы (думаете, что вам) нужны эти 'Promise.resolve' звонки? Разве прядильщик, 'getProducts' и методы обновления не возвращают обещания сами по себе? – Bergi

ответ

2

Я считаю, что это потому, что Promise.resolve() не делает то, что вы думаете.

Promise.resolve() создает новое обещание и немедленно решает его, используя значение того, что ему дано. Такие вещи, как setTimeout, немедленно возвращают свой идентификатор (целое число), поэтому они не делают то, что вы хотите. Ваш getProducts(), вероятно, является асинхронным вызовом, поэтому он может возвращать null или что-то еще (если он возвращает Promise или возвращает значение синхронно, то это нормально).

Вам лучше написать обычное обещание и позвонить resolve() в соответствующее время.

const mainPromise =() => Promise.resolve(
    console.log('spinner spinning...') 
    ...spinner code.... 
); 

// Assuming it's already returning a Promise or synchronous response. If it isn't, then deal with it like the setTimeout ones below. 
const getData =() => someObj.getProducts('data.json') 

const updateProduct =() => new Promise(resolve => { 
    setTimeout(()=>{ 
     someObj.updateProductHTML(); 
     resolve(); 
    }, 0) 
}); 

// You don't NEED to in your example since it's at the end of the chain, but you probably want to wrap this too in case you add to the chain. 
const updateDom =() => new Promise(resolve => { 
    setTimeout(()=>{ 
     someObj.updateDOM(); 
     resolve(); 
    }, 0) 
}); 
+0

Что возвращает 'mainPromise()'? Должен ли конструктор 'Promise' заменять' Promise.resolve() 'на' mainPromise'? – guest271314

+0

'mainPromise()' возвращает 'Promise', который затем может быть скован. ** ** ** возвращает значение null, но это нормально. – samanime

+0

Какова цель использования 'Promise.resolve()' at 'mainPromise'? Где "console.log ('spinner spinning ...') ... код счетчика .... // это пропущенный код" являются параметрами? – guest271314

Смежные вопросы