was mein Code versucht zu tun ist, erstellen Sie ein Array von Objekten, die einige dynamische Eigenschaften haben, diese Eigenschaften sind als Ergebnis einiger Funktionen gefüllt werden. Ich versuche, Versprechungen zu verwenden, andernfalls wird meine Vorlage gerendert, bevor die Funktion beendet ist und die Eigenschaften dieser Objekte null oder undefiniert sind, was zu Fehlern in der Vorlage führt.JS - Versprechen in der falschen Reihenfolge
Dies ist die erste Funktion
fetchUserPortfolioCoins({ commit, dispatch, state, rootGetters }) {
const promises = []
promises.push(dispatch('utilities/setLoading', true, { root: true })) // start loader
if (!rootGetters['auth/isAuthenticated']) {
// if user isn't logged, pass whatever is in the store, so apiDetails will be added to each coin
let coins = state.userPortfolioCoins
coins.forEach(coin => { promises.push(dispatch('createAcqCostConverted', coin)) })
commit('SET_USER_COINS', { coins, list: 'userPortfolioCoins' })
} else {
// otherwise, pass the response from a call to the DB coins
Vue.axios.get('/api/coins/').then(response => {
let coins = response.data
coins.forEach(coin => { promises.push(dispatch('createAcqCostConverted', coin)) })
commit('SET_USER_COINS', { coins, list: 'userPortfolioCoins' })
})
}
Promise.all(promises)
.then(() => {
commit('SET_USER_PORTFOLIO_OVERVIEW')
dispatch('utilities/setLoading', false, { root: true })
})
.catch(err => { console.log(err) })
},
dass dies nennt man:
createAcqCostConverted({ dispatch, rootState }, coin) {
const promises = []
// this check is only going to happen for sold coins, we are adding sell_price_converted in case user sold in BTC or ETH
if (coin.sell_currency === 'BTC' || coin.sell_currency === 'ETH') {
const URL = `https://min-api.cryptocompare.com/data/pricehistorical?fsym=${coin.coin_symbol}&tsyms=${rootState.fiatCurrencies.selectedFiatCurrencyCode}&ts=${coin.sold_on_ts}`
promises.push(Vue.axios.get(URL, {
transformRequest: [(data, headers) => {
delete headers.common.Authorization
return data
}]
}))
}
// if user bought with BTC or ETH we convert the acquisition cost to the currently select fiat currency, using the timestamp
if (coin.buy_currency === 'BTC' || coin.buy_currency === 'ETH') {
const URL = `https://min-api.cryptocompare.com/data/pricehistorical?fsym=${coin.coin_symbol}&tsyms=${rootState.fiatCurrencies.selectedFiatCurrencyCode}&ts=${coin.bought_on_ts}`
promises.push(Vue.axios.get(URL, {
transformRequest: [(data, headers) => {
delete headers.common.Authorization
return data
}]
}))
} else {
// if the selected fiatCurrency is the same as the buy_currency we skip the conversion
if (coin.buy_currency === rootState.fiatCurrencies.selectedFiatCurrencyCode) {
coin.acquisition_cost_converted = NaN
return coin
// otherwise we create the acq cost converted property
} else promises.push(dispatch('fiatCurrencies/convertToFiatCurrency', coin, { root: true }))
}
Promise.all(promises)
.then(response => {
const value = response[0].data[coin.coin_symbol][rootState.fiatCurrencies.selectedFiatCurrencyCode]
if (coin.sell_currency === 'BTC' || coin.sell_currency === 'ETH') coin.acquisition_cost_converted = value
if (coin.buy_currency === 'BTC' || coin.buy_currency === 'ETH') coin.acquisition_cost_converted = value
return coin
})
.catch(err => { console.log(err) })
},
Das Problem ist, dass die erste Funktion nicht für die zweite wartet abzuschließen. Wie kann ich diesen Code anpassen, um das Problem zu beheben?
Dank
Versuchen Sie Ihr Beispiel eine Reduzierung minimal in sich geschlossen, die immer noch das Problem zeigt. Wenn Sie Glück haben, wird es ausreichen, dass Sie selbst herausfinden, was das Problem ist. Wenn nicht, wird es für andere viel einfacher sein, es zu sehen und Ihnen zu helfen. Siehe auch http://www.sscce.org/ für weitere Tipps, wie Sie ein gutes Beispiel erstellen und reduzieren können. – Hjulle
'createAcqCostConverted' gibt manchmal' Münze' (d. H.'Wenn die ausgewählte fiatCurrency die gleiche ist wie die buy_currency' - in diesem Fall wird jedes an Versprechen abgegebene Versprechen" verloren "und zu anderen Zeiten wird" undefiniert "zurückgegeben ... und gibt niemals eine Promise - diese Promise.all-Anweisung zurück am Ende nicht "magisch" eine Zusage zurück, müssen Sie 'Promise.all' zurückgeben, wenn Sie ein Versprechen zurückgeben wollen –
@JaromandaX danke dafür, ich war verwirrt auf, wo die Rückkehr, wenn innerhalb der. then() oder wo, das löscht etwas Verwirrung .. Noch funktioniert die erste Funktion nicht wie erwartet – Giacomo