New*_*Aid 0 javascript es6-promise
我正在阅读有关JS Promises的技能.
这里是我的奎德里:假设你想console.log('we done, bruh!') 后您的数据的回来.
所以有了承诺,你可能会说:
let iWantToLogOut = function() {
let data = fetch('https://jsonplaceholder.typicode.com/users')
return new Promise((resolve) => {
resolve(data)
})
}
Run Code Online (Sandbox Code Playgroud)
然后解决这个承诺:
iWantToLogOut().then((dataBack)
=> databack.json())
.then((json) => {
console.log('We done, bruh! Look: ', json)
})
Run Code Online (Sandbox Code Playgroud)
这太好了.您将获得API数据,然后我们将消息记录下来.
但这不是一件容易的事情:
let data = fetch('https://jsonplaceholder.typicode.com/users');
data ? console.log('we done, bruh!') : null;
Run Code Online (Sandbox Code Playgroud)
我可能过度简化/遗漏了一些东西(因为......好吧......我迟钝了)但我只是想确保在进入Async/Await之前我真正理解Promises.
但这不是一件容易的事情:
Run Code Online (Sandbox Code Playgroud)let data = fetch('https://jsonplaceholder.typicode.com/users'); data ? console.log('we done, bruh!') : null;
它会,但它不起作用.什么fetch返回的是一个承诺,而不是操作的结果.您无法返回异步进程的结果.更多:如何从异步调用返回响应?
然而,在即将发布的ES2017规范中,我们有关于承诺消费的语法糖,可以让你写下这个:
let data = await fetch('https://jsonplaceholder.typicode.com/users');
// --------^^^^^
console.log('we done, bruh!');
Run Code Online (Sandbox Code Playgroud)
请注意,我们甚至不需要条件,因为await将promise拒绝转换为异常.
该代码需要在一个async函数中,例如:
(async function() {
let data = await fetch(/*...*/);
// use data here
})();
Run Code Online (Sandbox Code Playgroud)
某些浏览器中的JavaScript引擎已经支持async/ await,但是为了在野外使用它,你需要使用Babel或类似的东西进行转换.
注意:你已经证明了
所以有了承诺,你可能会说:
Run Code Online (Sandbox Code Playgroud)let iWantToLogOut = function() { let data = fetch('https://jsonplaceholder.typicode.com/users') return new Promise((resolve) => { resolve(data) }) }
该代码存在一些问题:
如果fetch失败,它永远不会解决您创建的承诺.
它调用的data不是数据,它是数据的承诺(主要是风格,但它具有误导性).
它展现了创造反模式的承诺.你已经有了承诺(来自fetch),不需要创建另一个承诺.
iWantToLogOut 应该简单地说:
let iWantToLogOut = function() {
return fetch('https://jsonplaceholder.typicode.com/users');
};
Run Code Online (Sandbox Code Playgroud)
这将返回一个将使用数据解决的承诺,当然也会被拒绝.然后使用promise方法或await(在async函数内)使用它.