一、什么是 Web 开发?

如果在一个比较高的抽象层面来看待这个问题的话,Web 开发就是在处理客户端请求及服务端响应这两件事

Web 开发

当然,这是抽象。在实际的 Web 开发中,我们会有很多东西需要关注。

阅读更多

一、Promise 是什么?

不是讲 async/await 吗?为什么会提到 Promise

实际上,async/awaitPromise 的一个拓展,所以,想要更好地理解 async/await,需要先理解 Promise

我们先看看 Promise 是什么。先在浏览器中使用 console.dir(Promise) 打印出 Promise 对象的所的属性和方法:

Promise

从打印结果可以看出,Promise 是一个构造函数,它自己本身有 allrejectresolve 等方法,原型上有 catchfinallythen 等方法。所以 new 出来的 Promise 对象也就自然拥有 catchfinallythen 这些方法。从上图中可以看到,then 方法返回的是一个新的 Promise 实例(注意,不是原来那个 Promise 实例)。因此可以采用链式写法,即 then 方法后面再调用另一个 then 方法。

Promise 的中文意思是承诺,这种“承诺将来会执行”的对象在 JavaScript 中称为 Promise 对象。简单说就是一个容器,里面保存着某个未来才会执行的事件(通常是一个异步操作)的结果。

阅读更多

一、问题描述

前几天,项目中遇到一个 JavaScript 异步问题:

有一组数据,需要对每一个数据进行一个异步处理,并且希望处理的时候是同步的。

用代码描述如下:

// 生成数据
const getNumbers = () => {
  return Promise.resolve([1, 2, 3])
}

// 异步处理
const doMulti = num => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (num) {
        resolve(num * num)
      } else {
        reject(new Error('num not specified'))
      }
    }, 2000)
  })
}

// 主函数
const main = async () => {
  console.log('start');
  const nums = [1, 2, 3];
  nums.forEach(async (x) => {
    const res = await doMulti(x);
    console.log(res);
  });
  console.log('end');
};

// 执行
main();
阅读更多

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。

例如,net.Server 会在每次有新连接时触发事件,fs.ReadStream 会在打开文件时触发事件,stream 会在数据可读时触发事件。

所有能触发事件的对象都是 EventEmitter 类的实例。

一、EventEmitter 类

events 模块只提供了一个对象: events.EventEmitterEventEmitter 的核心就是事件触发与事件监听器功能的封装。

我们可以通过 require('events'); 来访问该模块:

// 引入 events 模块
const Event = require('events');
// 创建 eventEmitter 对象
const eventEmitter = new Event.EventEmitter();
阅读更多

一、如何使用 setState

React 中,一个很重要的点就是不要直接去修改 state,类似于这样的写法:this.state.count = 1 ,这种方式是无法触发 React 去更新视图的。因为 React 的机制中规定了:一个 state 的更新,首先需要调用 setState 方法:

this.setState({
    count: 1
})

稍有经验的 React 开发者都会知道,setState 方法其实是异步的。即 setState 立马执行之后,是无法直接获取到最新的 state 的,需要经过 Reactstate 的所有改变进行合并处理之后,才会去计算新的虚拟 DOM,然后再根据最新的虚拟 DOM 去重新渲染真实 DOM

所以,这里我们谈到的异步,并不是异步代码,而是说 react 会先收集变更,然后再进行统一的更新

阅读更多

三步走:

1、创建序列 sequence

create sequence seq_stu
      increment by 1    -- 每次递增1
      start with 1       -- 从1开始
      nomaxvalue      -- 没有最大值
      minvalue 1       -- 最小值=1
      NOCYCLE;      -- 不循环

2、为序列创建触发事件

create or replace trigger student_id_automation
  before insert
  on student
  for each row
begin
  IF :new.id IS NULL THEN :new.id := seq_stu.nextval;
  end if;
end;
阅读更多

JavaScript 模块化

JavaScript 模块化的发展历史:无模块化 –> CommonJS 规范 –> AMD 规范 –> CMD 规范 –> ES6 模块化。

下面我们根据这个发展历史来讲解 JavaScript 模块化的内容。

一、无模块化

<script src="jquery.js"></script>
<script src="jquery_scroller.js"></script>
<script src="main.js"></script>
<script src="other1.js"></script>
<script src="other2.js"></script>
<script src="other3.js"></script>

即简单的将所有的 js 文件统统放在一起。但是这些文件的顺序不能出错,比如 jquery 需要先引入,才能引入 jquery 插件。缺点很明显:

  • 污染全局作用域
  • 维护成本高
  • 依赖关系不明显
阅读更多
2 / 12