2017-09-13 39 views
-2

我有兩個承諾。一個沒有解決,我不知道爲什麼。爲什麼我的承諾不能解決?

processTradeOffer:承諾鏈,試圖procced對象稱爲'報價'identifyOffer返回var可能是「valida」 | 「aceptable」 | 「denegable」。如果是'valida',我們需要識別offer。所以我們需要另一個異步函數,即identifyItems(offer)將返回var'offerState'「denegable」| 「aceptable」,然後我們可以拒絕或接受報價。

我知道問題沒有在聲明中(offerState =='valida')。 代碼:

const processTradeOffer = function(offer) { 
    return new Promise(function(resolve, reject) { 
     identyOffer(offer) 
      .then(function(offerState) { 
       return finishTradeOffer(offer, offerState); 
      }).then(function() { 
       console.log('aqui'); 
       return resolve(); 
      }) 
    }) 
} 
const finishTradeOffer = function(offer, offerState) { 

    return new Promise(function(resolve, reject) { 
     if (offerState == 'aceptable') { 
      acceptTradeOffer(offer).then(function() { 
       return resolve(); 
      }) 
     } else if (offerState == 'denegable') { 
      declineTradeOffer(offer).then(function() { 
       console.log('here'); 
       return resolve(); 
      }) 
     } else if (offerState == 'valida') { 
      identifyItems(offer).then(function(offerState) { 
       finishTradeOffer(offer, offerState); 
      }) 
     } 
    }) 
} 

CONSOLE.LOG( '這裏')被成功地發射和CONSOLE.LOG( '褐')不。

+3

你根本不應該使用'new Promise()'。 – SLaks

+0

如果'offeringtate =='valida''應該會發生什麼?順便說一句,'.then(function(){return resolve();})'和'then(resolve)'是一樣的,但是你不應該這樣做。 – 2017-09-13 19:06:49

+0

它看起來像'identyOffer','acceptTradeOffer'等已經返回承諾,因爲你正在調用'then()'。是對的嗎? –

回答

1

首先避免使用Promise constructor antipattern。你的功能已經回覆了承諾。

添加catch回調來處理可能的錯誤。

const processTradeOffer = function(offer) { 
    return identyOffer(offer) 
    .then(function(offerState) { 
     return finishTradeOffer(offer, offerState); 
    }) 
    .then(function() { 
     console.log('aqui'); 
    }) 
    .catch(err => console.log(err)); 
} 

const finishTradeOffer = function(offer, offerState) { 
    switch (offerState) { 
    case 'aceptable': 
     return acceptTradeOffer(offer); 
    case 'denegable': 
     return declineTradeOffer(offer); 
    case 'valida': 
     return identifyItems(offer) 
     .then(function(offerState) { 
      return finishTradeOffer(offer, offerState); 
     }); 
    default: 
     return Promise.resolve(); 
} 
+0

我對此並不興奮,因爲'processTradeOffer'返回的promise的值將是'console.log'的返回值,它將是'undefined',而不是從調用返回的值到finishTradeoffer ',這很可能是我們所期望的。任何拒絕都會被'catch'抓住,並且變成一次成功,再次用'console.log(err)'的值,這不太可能是你想要的。 – 2017-09-13 19:41:28

+0

好的。這對我來說是最好的解決方案。我肯定需要閱讀更多關於承諾。還有一個問題:acceptTradeOffer和declineTradeOferr是失敗的異步函數。在那種情況下,錯誤會被捕獲? –

+0

@torazaburo我同意'processTradeOffer'返回一個帶有undefined值的承諾,但它是OP代碼,也許他不使用這個結果。問題在於爲什麼_console.log('aqui'); _沒有被調用,我試圖描述爲什麼。 'catch'塊怎麼樣,我再說一遍,我不知道如何使用'processTradeOffer'函數。如果它被獨立調用,那麼這個catch就是有效的。 – alexmac

2

的問題是,在此塊:

} else if (offerState == 'valida') { 
     identifyItems(offer).then(function(offerState) { 
      finishTradeOffer(offer, offerState); 
     }) 
    } 

你不打電話或者resolve()reject()因此函數落空,而無需調用任何回調的話,最終的「褐」塊不會被調用。

+0

@trincot您必須調用'resolve'才能讓promise執行'then'回調函數。 – 4castle

+0

我錯過了兩個函數之間的依賴關係。 – trincot

+0

不,不是。我叫同樣的承諾,直到offerState ='aceptable'或'denegable'。這可以嗎? –

1

請按如下方式編寫代碼。

const processTradeOffer = function(offer) { 
    const result = identyOffer(offer) 
    .then(offerState => finishTradeOffer(offer, offerState)) 

    result.then(() => console.log('aqui')); 

    return result; 
}; 

const finishTradeOffer = function(offer, offerState) { 
    switch(offerState) { 
    case 'aceptable': return acceptTradeOffer(offer); 

    case 'denegable': { 
     const result = declineTradeOffer(offer); 
     result.then(() => console.log('here')); 
     return result; 

    case 'valida': 
     return identifyItems(offer) 
     .then(offerstate => finishTradeOffer(offer, offerState)); 

    default: 
     throw "Invalid value for offerstate!!"; 
    } 
}; 

最基本的一點是要處理的valida的情況下,這樣的方式,承諾解決。另外,我們已經擺脫了「明確承諾構造函數反模式」。