为什么使用JS Promises而不是IF/ELSE/Ternary?

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.

T.J*_*der 7

但这不是一件容易的事情:

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

它会,但它不起作用.什么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或类似的东西进行转换.


注意:你已经证明了

所以有了承诺,你可能会说:

let iWantToLogOut = function() {

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

    return new Promise((resolve) => {
        resolve(data)
    })
}
Run Code Online (Sandbox Code Playgroud)

该代码存在一些问题:

  1. 如果fetch失败,它永远不会解决您创建的承诺.

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

  3. 它展现了创造反模式承诺.你已经有了承诺(来自fetch),不需要创建另一个承诺.

iWantToLogOut 应该简单地说:

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

这将返回一个将使用数据解决的承诺,当然也会被拒绝.然后使用promise方法或await(在async函数内)使用它.