2017-04-12 50 views
0

我正在读一些关于JS承诺的技巧。为什么使用JS Promises而不是IF/ELSE/Ternary?

这里是我的奎德里: 说你要console.log('we done, bruh!')数据的回来。

这样一个承诺,你可能会说:

let iWantToLogOut = function() { 

    let data = fetch('https://jsonplaceholder.typicode.com/users') 

    return new Promise((resolve) => { 
     resolve(data) 
    }) 
} 

然后决心许诺,如:

iWantToLogOut().then((dataBack) 
=> databack.json()) 
.then((json) => { 
    console.log('We done, bruh! Look: ', json)   
}) 

所以这是很大的。你得到你的API数据,然后,然后我们记录我们的消息。

但是是不是只是比较容易的方式去:

let data = fetch('https://jsonplaceholder.typicode.com/users'); 
    data ? console.log('we done, bruh!') : null; 

我可能是囫囵吞枣/缺少的东西(因为......呃......我是弱智),但我只是想在确定我真正理解Promise之前,先进入Async/Await。

+1

当然,如果阻止,它更容易!唯一的问题是,它不会工作:(太糟糕了,对吧?你还设置了'iWantToLogOut'错误。它应该是'let iWantToLogOut = function(){return fetch('https://jsonplaceholder.typicode。 com/users')}' – dfsq

+0

如果你这样做,那么每次你会碰到其他部分。 – Jai

+1

@DenisTsoi:时间与它无关,而且上面总会显示'我们完成了,布鲁赫!由'fetch'返回的值是一个真值。 –

回答

7

但是是不是只是比较容易的方式去:

let data = fetch('https://jsonplaceholder.typicode.com/users'); 
data ? console.log('we done, bruh!') : null; 

这会是这样,但它不工作。 fetch返回的是承诺,不是操作的结果。您不能返回异步进程的结果。更多:How do I return the response from an asynchronous call?

在即将到来的ES2017规范,不过,我们大约有承诺消费语法糖,这将让你这样写:

let data = await fetch('https://jsonplaceholder.typicode.com/users'); 
// --------^^^^^ 
console.log('we done, bruh!'); 

注意,我们甚至不需要条件,因为await一个转换承诺排除异常。

该代码将需要在async功能,如:

(async function() { 
    let data = await fetch(/*...*/); 
    // use data here 
})(); 

在某些浏览器中的JavaScript引擎已经支持async/await,但在野外使用它,你会想transpile与Babel或类似的。


注意:您已经证明

这样一个承诺,你可能会说:

let iWantToLogOut = function() { 

    let data = fetch('https://jsonplaceholder.typicode.com/users') 

    return new Promise((resolve) => { 
     resolve(data) 
    }) 
} 

有几个与该代码的问题:

  1. 它永远不会停滞不前他保证如果fetch失败就会创建。

  2. 它调用的东西data这不是数据,它的数据承诺(这主要是风格,但它是误导性的)。

  3. 它展示承诺创建反模式。你已经有了一个承诺(从fetch),不需要创建另一个。

iWantToLogOut应该是简单的:

let iWantToLogOut = function() { 
    return fetch('https://jsonplaceholder.typicode.com/users'); 
}; 

返回将与数据解决,或课程的拒绝承诺。然后您将使用承诺方法或await(在async函数内)使用。

+0

有趣的是await vs拒绝处理。请仔细阅读。 重新__ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _返回一个promise_东西。是的,因为我习惯于这样做,所以我不得不反抗将'.then()'固定在它上面的冲动。 我想那是有道理的。并将转向ES7/Babel'ing这些以保持简单。 @TJCrowder – NewbieAid

0

这不是一件容易的事。 通常网络调用应该是异步处理的(我不希望出现同步AJAX调用的反模式)。在这一点上,你有几个选项来处理它:

  1. 回调
  2. 承诺
  3. 观测量

在你上面的代码,当它是同步的,fetch应立即用承诺返回只有当服务器响应时才会解析为数据。只有这样你才能检查数据的内容。进一步。因为每一个承诺都可以实现或失败,那么你可以为每个承诺分配一个处理器,而不是使用三元组。

从最新规格:

工人的同步XMLHttpRequest的外面是在从网络平台被删除,因为它有不利的影响到最终用户的体验过程。 (这是一个耗时数年的漫长过程。)当前全局对象是Window对象时,开发人员不得为异步参数传递false。强烈建议用户代理在开发人员工具中警告此类用法,并且可能会尝试在发生InvalidAccessError异常时引发此异常。