为什么我的承诺无法解决?

Why my promise cant resolve?

我有两个承诺。一个没有解决,不知道为什么。

processTradeOffer:尝试处理名为 'offer' 的对象的承诺链。 identifyOffer return 可能是 "valida" 的变量 | "aceptable" | "denegable"。如果是 'valida',我们需要从报价中识别项目。所以我们需要另一个异步函数 identifyItems(offer) 将是 return 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('here') 成功触发,而 Console.log('aqui') 没有。

问题是在这个块中:

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

您既没有调用 resolve() 也没有调用 reject(),所以函数在没有调用任何一个回调的情况下失败,所以最终,"aqui" 块永远不会被调用。

请按如下方式编写代码。

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!!";
  }
};

基本点是以 promise 解决的方式处理 valida 的情况。此外,我们还去掉了 "explicit promise constructor anti-pattern".

首先避免使用Promise constructor antipattern。您的功能已经 return 承诺。

添加 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();
}