2017-09-13 87 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的情况下,这样的方式,承诺解决。另外,我们已经摆脱了“明确承诺构造函数反模式”。