2017-10-10 24 views
-1
getCategory().then((res) => { 
    let itemList = res; 
    return new Promise((resolve, reject) => { 
    for(let i=0; i < res.length; i++) { 
     getItems(res[i].url).then((itempage) => { 
     const $ = itempage; 
     const pagination = $('.pagination .page').toArray().length; 
     itemList[i].total_page = pagination; 
     }); 
    } 
    resolve(itemList); 
    }); 
}).then((res) => { 
    console.log(res); 
}); 

以上是我的代碼。首先,我將res分配給一個名爲itemList的新變量,它是一個對象數組。 然後我做了一些承諾的功能,並嘗試添加新的數據到itemList如何在一些承諾過程後返回新變量?

但是,當console.log(res)仍然打印出原來的itemList

我知道這可能是由promise函數引起的,但是如何解決呢?

+0

預期產量是多少?根本不清楚你的代碼。 –

+1

我認爲你的程序的邏輯需要重新審視。第一,你似乎有承諾的承諾。而且它們本質上是異步的,意味着它們沒有像你期望的那樣具有回報價值。您需要提供回調並與他們一起工作。也許如果你解釋你的確切商業案例,獲得幫助會更容易。 –

+0

嘗試在此行itemList [i] .total_page = pagination之後解析itemList; –

回答

1

試試這個

getCategory().then(itemList => { 
    return Promise.all([itemList, Promise.all(itemList.map(x => getItems(x.url)))]); 
}).then(([itemList, items]) => { 
    items.forEach(($, i) => { 
    itemList[i].total_page = $('.pagination .page').toArray().length; 
    }); 
    return itemList; 
}).then(console.log); 

我認爲,這將讓你有(即與側面影響itemList)。請注意,如果您的getItems調用失敗,這將失敗。

這實際上是Promises的一個常見問題:您想異步使用結果(如果您有選擇),但將其與原始結果結合使用。所以我在這裏使用了Promise.all來解決getItems調用的一系列Promises,這將把它變成一個單獨的Promise,它等待所有的結果。然後我把它放在一個itemList的數組中,然後在那個數組上調用Promise.all並返回Promise。然後在鏈中的下一個.then獲得一個內部有兩個數組的數組:原始的itemList和現在解析的調用getItems的數組。此時forEach執行副作用,我們只返回現在更新的itemList

+0

哇,這真的解決了我的問題。讚賞!我會試着理解這一點。 – Dreams

+0

@Dreams我更新了一個解釋,讓我知道如果你有其他問題。如果這對你有用,請考慮接受。 –