有没有人对ES6承诺有任何想法,我在我的Node应用程序中使用它们,我喜欢它们,大多数情况下。但是我发现,如果我在一个解决回调中遇到某种错误,它就不会抛出错误或执行拒绝回调,而是让我的服务器无限挂起。
现在我已经采取了这种做法,并手动拒绝了捕获错误的承诺,但我不确定这是否是一个很好的处理方式,和/或我是否应该使用promises一点都不。
this.dataStore.set(newID, value).then( (foo) => {
try{
this.var = foo;
res({val: foo});
}catch(e){
rej(e);
}
}, (e) => {
rej(e);
});
答案 0 :(得分:4)
我认为混淆的原因在于,基于您在此使用res
和rej
,您可能会在承诺构造函数中调用此函数,而不是
function setStore(newID, value) {
return new Promise(function(res, rej) {
this.dataStore.set(newID, value).then( (foo) => {
try{
this.var = foo;
res({val: foo});
}catch(e){
rej(e);
}
}, (e) => {
rej(e);
});
});
}
顺便说一下,最后的(e) => { rej(e); }
部分可以重写为e => rej(e)
,而rej
又可以重写为this.dataStore.set
。
但无论如何,你不需要任何周围的机制来创建和回复你自己的承诺,因为then
和/或随后对then
的呼叫已经创建一个您可以按原样返回的承诺。而不是创建自己的新承诺,然后使用基于传递给dataStore.set
的结果的小哈希来解析新承诺,只需返回哈希 - 这将成为结果承诺。当function setStore(newID, value) {
return this.dataStore.set(newID, value).then(foo => {
this.var = foo;
return {val: foo};
});
}
的调用失败时,不要拒绝你的新承诺,而是让失败的承诺本身。
所以你不应该做比
更复杂的事情this.var = foo; return {val: foo};
this.dataStore.set
部分发生错误(但怎么可能?)会自动将承诺置于失败状态。由setStore('abc', 123)
.then(hash => console.log(hash.val))
.catch(e => console.log("The sky is falling", e));
导致的失败将导致失败的承诺,并且没有必要捕获它并重新抛出它 - 失败将在链中快速进行。
将此用作:
promise.then(success, failure)
作为澄清问题,在以下内容中:
success
在failure
回调中success
回调中出现的错误不处理。 success
回调中的失败将在链的连续阶段中处理。您可以使用
promise
(或promise.then(success).catch(failure)
本身)中的失败
private void CharsAvailable()
{
int num = 0;
int num2 = 0;
string text = this.txtMessage.Text;
if (this.chkSignature.Checked)
{
text = text + Environment.NewLine + this.txtSignature.Text;
}
else
{
text = this.txtMessage.Text;
}
int num3 = 0;
while (num != 1 && num3 < this.txtMessage.TextLength)
{
if (text[num3] < '0' || text[num3] > '9')
{
if (text[num3] < 'A' || text[num3] > 'Z')
{
}
..............................
SOME CODE
............................
if (num == 1)
{
int num4 = text.Length;
if (num4 <= 70)
{
num4 = 1;
}
else
{
num4 += 62;
num4 -= num4 % 63;
num4 /= 63;
}
frmCompose.isUnicodeFound = true;
this.lblChar.Text = string.Concat(new object[]
{
text.Length,
" characters, ",
num4,
" SMS message(s)"
});
}
else
{
int num4 = text.Length + num2;
if (num4 <= 160)
{
num4 = 1;
}
else
{
num4 += 152;
num4 -= num4 % 153;
num4 /= 153;
}
frmCompose.isUnicodeFound = false;
this.lblChar.Text = string.Concat(new object[]
{
text.Length + num2,
" characters, ",
num4,
" SMS message(s)"
});
}
}
//validation
if (this.txtMessage.Text.Trim().Length == 0)
{
MessageBox.Show("Blank messages cannot send. Please type the message.", "Blank Message");
}
else if (frmCompose.isUnicodeFound && this.cmbLanguage.SelectedIndex == 0)
{
MessageBox.Show("Please choose 'Unicode' in Language dropdown to send message(s) in non English.”", "Unicode Message");
}enter code here