因此,我對承諾的理解讓我相信,我的其他承諾會在我的鏈條中一個接一個地運行,但我在這裏做錯了事。承諾不在彼此等待
我使用的是目前的代碼如下
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也有一個for循環工作者來構建我的對象數組,並在我的所有.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 -
我有被稱爲分岔/分離的問題。我只需要弄清楚鏈接來解決我的問題。
- FINAL -
這是我結束了工作了
// 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和bar進行工作確定正確的,但我覺得仍然有些事情不對。
嘗試返回Promise.resolve(...) –
他正在使用的格式將返回該解析。 – samanime
爲什麼你(認爲你)需要那些'Promise.resolve'調用?微調,'getProducts'和更新方法不會自行返回承諾嗎? – Bergi