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

时间:2017-09-13 19:02:39

标签: javascript node.js promise resolve

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

processTradeOffer :试图推销名为'提供' 的对象的承诺链。 identifyOffer 返回可能" valida" |的var " aceptable" | " denegable" 。如果是有效的'我们需要识别出来的商品。所以我们需要另一个异步函数,即 identifyItems(offer)将返回var' offerState' " denegable" | " aceptable"然后我们可以拒绝或接受报价。

我知道那里的问题没有声明(offerState ==' valida')。 代码:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<!DOCTYPE html>
<html>

<head>
  <link rel="stylesheet" type="text/css" href="stylesheet.css" />
  <link href="https://fonts.googleapis.com/css?family=Anton|Baloo+Tammudu" rel="stylesheet">
  <script type="text/javascript" src="http://code.jquery.com/jquery-
1.9.1.min.js"></script>
  <script type="text/javascript" src="file:///C:/Users/Will/Desktop/JS_Test/script.js"></script>
</head>

<body>
  <div class=app>
    <div id=menu_container>
      <div id=menu_title> Menu </div>


      <input id="ListInput" /></input>

      <button id="AddToList">Add</button>

      </input>
      <select id="GroceryType" list=hosting-plan>
              <option>Select</option>
              <option name=produce value=1>Produce</option>
              <option name=baking value=2>Baking</option>
                <option name=meat value=3>Meat</option>
                <option name=dairy value=4>Dairy</option>
                <option name=frozen value=5>Frozen</option>
                <option name=etc value=6>Etc</option>

              </select>
    </div>


    <div id=list_container>
      <div id=list_title> Grocery List </div>

      <div class=sublist_container>

        <ul id="Produce">
          Produce
        </ul>

        <ul id="Baking">
          Baking
        </ul>

        <ul id="Meat">
          Meat
        </ul>

        <ul id="Dairy">
          Dairy
        </ul>

        <ul id="Frozen">
          Frozen
        </ul>

        <ul id="Etc">
          Etc
        </ul>

      </div>
    </div>
  </div>
</body>

Console.log(&#39; here&#39;)成功解雇,而Console.log(&#39; aqui&#39;)则不会。

3 个答案:

答案 0 :(得分:2)

问题是在这个块中:

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

你没有调用resolve()reject()所以函数没有调用任何回调,所以最终,“aqui”块永远不会被调用。

答案 1 :(得分: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的情况。此外,我们已经摆脱了明确的承诺构造函数反模式&#34;。

答案 2 :(得分: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();
}