Discuss / JavaScript / Promise 对象

Promise 对象

Topic source

Junes_99994

#1 Created at ... [Delete] [Delete and Lock User]

浏览器前端显示进程(render process)里有很多线程,其中执行js代码的是主线程(main thread,MT)

通过异步(async)方法,可以将当前任务交给其他线程(或进程)如网络线程(network thread,NT)并行处理。

// promiselet url = "https://get.geojs.io/v1/ip/country.json?ip=223.5.5.5fetch(url)    .then(        response => {            console.log(response.status);            let json = response.json()            console.log(json);// Promise object            return json;        },        err => {            return new Promise((resolve, reject) => reject(err.message));        }    )    .then(        data => {            console.log(data)        },        err => console.log("hi:", err.message || err)    )    // .catch(err => console.error('Error:', err))

如上过程很简单

  1. MT 请求查询ip=223.5.5.5归属地

  2. NT 尝试获取,得到两种可能结果:完成 或 失败(如拔网线,缺省部分链接资源地址)

  3. MT将fetch的结果包装到Promise对象p1中,选择执行其后then中的两个函数,并再次将结果包装到p2中

  4. MT调用p2的then方法,显示状态内容

Promise 是一个语法糖,它可以将一个异步操作结束时的状态(成败)、对应的数据打包,再通过promise.then,将对应的处理函数也捆绑上去。

Promise 方法以一个函数f为参数,当创建一个Promise对象 p 后,p 调用 f(resolve, reject),resolve和reject这两个函数会将其在函数 f 中接受到的内容专递给Promise对象的PromiseResult属性,并更新PromiseState——如果调用的是resolve则为'fulfilled',反之为'rejected' 。如果谁都没有调用,则为'pending'等待中。如果在f中多次重复调用这两函数,则最先调用的函数有效,之后的无效。

p.then 会根据

Junes_99994

#2 Created at ... [Delete] [Delete and Lock User]

p.then 会根据 p 的PromiseResult选择调用回调函数,并将之前调用f获得的内容专递给相应回调函数。

// promise
let url = "https://get.geojs.io/v1/ip/country.json?ip=223.5.5.5"
fetch(url)
    .then(
        response => {
            console.log(response.status);
            let json = response.json()
            console.log(json);// Promise object
            return json;
        },
        err => {
            return new Promise((resolve, reject) => reject(err.message));
        }
    )
    .then(
        data => {
            console.log(data)
        },
        err => console.log("hi:", err.message || err)
    )
    // .catch(err => console.error('Error:', err))

  • 1

Reply