使用 JavaScript Promise 读取 Github 用户数据

 更新时间:2022年08月15日 15:18:17   作者:JerryWang_sap  
这篇文章主要介绍了使用JavaScript Promise读取Github用户数据,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

代码如下:

// Make a request for user.json
fetch('/article/promise-chaining/user.json')
  // Load it as json
  .then(response => response.json())
  // Make a request to GitHub
  .then(user => fetch(`https://api.github.com/users/${user.name}`))
  // Load the response as json
  .then(response => response.json())
  // Show the avatar image (githubUser.avatar_url) for 3 seconds (maybe animate it)
  .then(githubUser => {
    let img = document.createElement('img');
    img.src = githubUser.avatar_url;
    img.className = "promise-avatar-example";
    document.body.append(img);

    setTimeout(() => img.remove(), 3000); // (*)
  });

这里的语义比较清楚,每一个 then 调用都返回一个 Promise,后续的 then 调用,必须在前一个 then 调用返回的 Promise 被 resolve 之后,才能得到执行。

不过上述代码有一个缺陷:

看 * 所在行的代码:在头像完成显示并被移除后,如果我们想添加一些额外的处理逻辑,应该怎么做? 例如,我们想显示一个用于编辑该用户或其他内容的表单。

为了使链可扩展,我们需要返回一个在头像完成显示时进行 resolve 的 Promise.

代码如下:

fetch('/article/promise-chaining/user.json')
  .then(response => response.json())
  .then(user => fetch(`https://api.github.com/users/${user.name}`))
  .then(response => response.json())
  .then(githubUser => new Promise(function(resolve, reject) { // (*)
    let img = document.createElement('img');
    img.src = githubUser.avatar_url;
    img.className = "promise-avatar-example";
    document.body.append(img);

    setTimeout(() => {
      img.remove();
      resolve(githubUser); // (**)
    }, 3000);
  }))
  // triggers after 3 seconds
  .then(githubUser => alert(`Finished showing ${githubUser.name}`));

也就是说,(*) 行中的 .then 处理程序现在返回新的 Promise,该 Promise 仅在 setTimeout (**) 中的 resolve(githubUser) 调用后才被解决。 链中的下一个 .then 将等待它。

下图第 5 行新建的 Promise 对象,这个对象在第 13 行会 resolve,这个 resolve 操作,会触发等待它的第 17 行的 then 方法。 

作为一种好的实践,异步操作应始终返回一个 Promise. 这使得在它之后的计划行动成为可能;即使我们现在不打算扩展链,我们以后也可能需要它。

最后我们对代码进行重构。

function loadJson(url) {
  return fetch(url)
    .then(response => response.json());
}

以上的函数返回一个 Promise,当 response 的 json 数据可用时,这个 promise 后注册的 .then 函数就会触发。

看其消费代码:

26 行 then 里的箭头函数触发时,user 就是 25 行 user.json 数据被反序列化之后形成的 JSON 对象。

function loadGithubUser(name) {
  return loadJson(`https://api.github.com/users/${name}`);
}

只是对 loadJson 的一层封装,让调用者不需要知道 Github user api 具体的 endpoint.

function showAvatar(githubUser) {
  return new Promise(function(resolve, reject) {
    let img = document.createElement('img');
    img.src = githubUser.avatar_url;
    img.className = "promise-avatar-example";
    document.body.append(img);

    setTimeout(() => {
      img.remove();
      resolve(githubUser);
    }, 3000);
  });
}

返回一个 Promise,在其 executor 里书写业务逻辑,并通过 resolve(githubUser) 将 Promise 状态设置为 fulfilled,方便将来的扩展。

最后的完整代码:

// Use them:
loadJson('/article/promise-chaining/user.json')
  .then(user => loadGithubUser(user.name))
  .then(showAvatar)
  .then(githubUser => alert(`Finished showing ${githubUser.name}`));
  // ...

总结:

如果 .then(或 catch/finally,无关紧要)处理程序返回一个 Promise,则 Promise 链的其余部分会一直等待,直到这个 pending 的 Promise 被 resolve. 当 Promise 内部的 executor 有数据被 resolve 调用时,resolve 输入的数据(或错误)会被进一步传递到 Promise chain 里的其他 Promise.then 中去。

到此这篇关于使用 JavaScript Promise 读取 Github 用户数据的文章就介绍到这了,更多相关 JavaScript Promise 读取内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript获得选中文本内容的方法

    JavaScript获得选中文本内容的方法

    今天希望实现一个,直接在网页上选中文本,点击收藏夹的链接(javascript)即可弹出新窗口(类似“百度搜藏”和“QQ书签”),新窗口中的文本框即显示了选中的文本。
    2008-12-12
  • 基于JavaScript实现报警器提示音效果

    基于JavaScript实现报警器提示音效果

    这篇文章给大家分享分享一段代码基于JavaScript实现报警器提示音效果,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-10-10
  • 将函数的实际参数转换成数组的方法

    将函数的实际参数转换成数组的方法

    实际参数在函数中我们可以使用 arguments 对象获得 (注:形参可通过 arguments.callee 获得),虽然 arguments 对象与数组形似,但仍不是真正意义上的数组。
    2010-01-01
  • Bootstrap每天必学之折叠(Collapse)插件

    Bootstrap每天必学之折叠(Collapse)插件

    Bootstrap每天必学之折叠(Collapse)插件,折叠插件可以很容易地让页面区域折叠起来,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • Bootstarp风格的toggle效果分享

    Bootstarp风格的toggle效果分享

    这篇文章主要介绍了Bootstarp风格的toggle效果分享的相关资料,需要的朋友可以参考下
    2016-02-02
  • javascript预加载图片、css、js的方法示例介绍

    javascript预加载图片、css、js的方法示例介绍

    预加载的好处可以让网页更快的呈现给用户,缺点就是可能会增加无用的请求,不多说了,作为一个前端攻城师都懂的,下面分享我做的测试和得到的结果
    2013-10-10
  • JS表格组件神器bootstrap table使用指南详解

    JS表格组件神器bootstrap table使用指南详解

    这篇文章主要为大家详细介绍了JS表格组件神器bootstrap table使用指南,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • js数组反转的几种常见方法举例

    js数组反转的几种常见方法举例

    最近学到了数组的使用方法,给大家分享一下,这篇文章主要给大家介绍了关于js数组反转的几种常见方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • 小程序转发探索示例

    小程序转发探索示例

    这篇文章主要介绍了小程序转发探索示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • 大白话讲解JavaScript的Promise

    大白话讲解JavaScript的Promise

    这篇文章主要介绍了大白话讲解JavaScript的Promise,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04

最新评论