为什么我的承诺无法解决?
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();
}
我有两个承诺。一个没有解决,不知道为什么。
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();
}