我有两个承诺。一个没有得到解决,我不知道为什么。
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;)则不会。
答案 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();
}