2015-08-21 69 views
0

例子:??蓝鸟承诺:是否可能有多个阻()在新的承诺(函数(解析,拒绝)

function multiRejectExample(){ 
    return new Promise(function (resolve, reject){ 
    if(statement){ 
     console.log('statement 1'); 
     reject(throw new Error('error')); 
    } 
    if(statement){ 
    console.log('statement 2'); 
    reject(throw new Error('error')); 
    } 
    }); 
} 

我使用蓝鸟就是上面还好做的就是它不好的做法?

另外,如果在第一个语句拒绝,为什么“语句2”还是打印出来?我想,如果“拒绝”返回,怎么我做到这一点?

是更好地使用Promise.try然后抛出错误?Help!谢谢!

+1

'reject()'调用只是一个函数调用。它不会导致调用函数返回。 – Pointy

+0

我应该怎么做才能获得理想的结果? – esanz91

+1

也许在reject()调用后添加一个'return',如果这是你想要的。或者在后续的测试中使用'else if'。 – Pointy

回答

4

可能在新Promise中有多个reject()函数(函数 (resolve,reject))?

是的,你可以有多个地方,你可以拨打reject()作为承诺。这对承诺来说通常是正确的,而不仅仅是一个蓝鸟功能。

承诺是一个单向的状态机。一旦它被一个理由拒绝了,它不会再改变它的状态。

我正在使用蓝鸟。上面的行为是可以做的吗?这是不好的做法吗?

它不叫一次reject()更上了同样的承诺一个错误,但只有reject()第一个通话将被记录,并在承诺拒绝的原因。后续对reject()的调用对于相同的承诺将被忽略。

如果你知道你的函数完成了它所需要做的并且已经调用了reject(),并且在该函数中不需要执行其他代码,那么让代码的其余部分继续执行是不好的做法。取决于代码是什么,它可能没有任何伤害,但是当你完成时,最好只是return

此外,如果在第一个语句中拒绝,为什么'语句2' 仍然打印出来?如果'拒绝'我想返回,我该怎么做?

调用reject()不会停止您的函数执行。它只是改变了承诺的状态。您的功能仍然继续执行,然后在您的功能完成后,将触发承诺的处理程序.then()。如果您在拨打reject()之后想要在功能中执行更多代码,则可以使用return语句。


在您的特定情况下,它可能会更有意义,只是return你拒绝后,如果需要以后将要运行其他代码,但它是没有必要的:

function multiRejectExample(){ 
    return new Promise(function (resolve, reject){ 
    if(statement){ 
     console.log('statement 1'); 
     reject(new Error('error')); 
     return; 
    } 
    if(statement){ 
    console.log('statement 2'); 
    reject(new Error('error')); 
    return; 
    } 
    }); 
} 

查看范例演示:http://jsfiddle.net/jfriend00/gtq49v9x/

+0

谢谢你的解释! – esanz91

+0

调用'reject()'时不要调用'throw',只是'return reject(new Error('error'));' – Erhhung

+0

@Erhhung - 更正了,不知道为什么'throw'在那里,尽管它可能是这样做的,因为投掷也被认为是拒绝,但它应该只有一个或另一个。 – jfriend00