2017-10-08 100 views
1

阅读文档按照我的理解中ES6的含义:从ES6箭解决的诺言功能

foo => someFun(foo); 

等同于:

foo => { return someFun(foo); } 

我返回一个新的承诺和内使用箭头函数调用拒绝方法的解决方法,例如

return new Promise(function(resolve, reject) 
{ 
    someFunThatReturnsAPromise() 
    .then(data => resolve(data)) 
    .catch(err => reject(err)); 
}); 

因此在后来竟代码,

.then(data => return resolve(data)) 

如果是这样,它的问题是解决的结果(其中我不知道值的类型)和我应该改为略少简洁,使用写{}防止隐式返回

.then(data => { resolve(data); }) 
+0

一些评论已经准确地表明内部承诺是不需要的。因此,请考虑原来的问题,但随后修改为“。然后(data => resolve(data.item))“,即执行一些额外的(尽管很轻微)处理 – const

+0

在任何情况下,避免['Promise'构造函数反模式](https://stackoverflow.com/q/23803743/1048572?什么是承诺 - 构建 - 反模式 - 以及如何避免 - 它),并且不要将'resolve' /'reject'作为回调传递给承诺! – Bergi

回答

0

如果你只是想返回数据,并拒绝柜面一个错误,那么你也不需要那么()

return new Promise(function(resolve, reject) 
{ 
    someFunThatReturnsAPromise() 
    .then(data => resolve(data)) 
    .catch(err => reject(err)); 
}); 

将相当于

return someFunThatReturnsAPromise() 

,除非你想做的数据

+0

不应该('reslove,reject)=> {...})' – Stavm

+0

someFunThatReturnsAPromise()已经返回一个promise,为什么你想把它包装在另一个promise中? – marvel308

+0

这是一个有效的问题。如果接下来的行是:然后(data => resolve(data.item))说 – const

0

resolve功能已经返回undefined一些处理,所以完全不会有什么区别,如果你含蓄与归还一行箭头函数或根本不从函数体返回它(因为后者意味着函数体隐式返回undefined本身)。

此外,由于您已将someFunThatReturnsAPromise()返回的承诺包装在新的承诺中,因此无论如何都无法处理退货,因此即使返回了某些东西也不会有任何区别。

更重要的是,你在新承诺中包装承诺的方式是反模式。 new Promise()构造仅用于处理尚未基于承诺的异步过程。
由于someFunThatReturnsAPromise()已经返回一个承诺,你不需要把它包装在一个新的,只需使用你得到的一个!
对于您的示例,它可以简单地意味着它返回:

return someFunThatReturnsAPromise() 

如果你想要做一些数据的处理,比如只返回数据的一部分(在下面的例子中,status属性),你这样做,在一个then回调:

return someFunThatReturnsAPromise().then(data => data.status) 

当您在then回调返回,它又会返回一个新的承诺,得到与你返回的数据解析(除非你回到另一个承诺,在这种情况下,它会当该承诺解决时解决)。
通过链接异步过程及其结果,这就是承诺的工作原理。

+0

太好了。我从你的其他评论中认识到,外在的诺言是不需要的。在我的实际代码中,我已经能够删除一堆这些,这减少了代码的大小。它还解决了外层Promise改变这种导致各种const self =这个现在已被删除的绑定的问题。谢谢! – const