promise的链式用法详细

本文重点分析了promise的链式用法。

1 简介

本文介绍promise对象的then,catch,finally方法及链式用法。重点介绍了then的使用方式以及对链式调用的执行过程。

 

如果你对promise不是很了解,可以先查看 promise初级文章-在上一篇文章 。

2 主要内容

•then的参数及执行逻辑•then的返回值•catch•finally•链式调用的逻辑

3 Promise实例的方法

在js中,对象会从它的构造器的原型对象中继承方法。例如:

var arr = new Array();arr.push();

上面的push方法其实是Array.protoType中的属性。

arr.push === Array.protoType.push ; // true

同样的道理,一个promise对象也会从Promise.prototype中继承方法。

•then()•catch()•finally()

4 then的格式及执行逻辑

then方法的作用是为Promise对象添加状态改变时的回调函数。下面从其调用格式,执行逻辑及返回值三个方面来介绍

4.1 then的格式

它可以写两个参数,如下:​​​​​​​

// p 是一个promise对象p.then(函数1[,函数2])

它的两个参数都是函数。

•第一个参数是resolved状态的回调函数。当p的状态从pending变成了resolved之后,函数1会执行。•第二个参数是rejected状态的回调函数。当p的状态从pending变成了rejected之后,函数2会执行。•其中第二个参数是可选的,如果只写一个参数的话就是如下:

promise对象.then(函数1)

4.2 执行逻辑

以如下代码为例​​​​​​​

var p = new Promise((resolve,reject)=>{   resolve(val1);   // or reject(val2)})
p.then((okVal)=>{    console.info("成功");    console.log(okVal);}, (errVal)=>{    console.info("失败");    console.log(errVal);})

它的两个参数都是函数,其执行逻辑是:

•如果promise对象的状态是resolved,则then()会执行第一个函数,并传入当前的PromiseValue(即上面的val1);•如果promise对象的状态是rejected,则then()会执行第二个函数,并传入当前的PromiseValue(即上面的val2);•特别地,如果promise对象的状态是rejected,且此时then方法并没有设置第二个参数,就会向外抛出一个错误,错误的提示大约是Uncaught (in promise)

示例代码1​​​​​​​

var p = new Promise((resolve,reject)=>{    //主动调用resolve,并传入1    resolve(1)})// 此时,P的状态是resolved,// 且值promiseValue 是1p.then((res)=>{   // p的状态是resolved,执行then的第一个参数   // 把promisevalue传进来   console.log("then,ok",res)})

执行输出结果是:then,ok,1

示例代码2​​​​​​​

var p = new Promise((resolve,reject)=>{ //主动调用reject,并传入实参2   reject(2)})// 此时,P的状态是rejected,且值promiseValue 是2.p.then((res)=>{   // p的状态是resolved   // 所以这句代码不会执行。   console.log("then,ok",res)},(err)=>{ // p的状态是rejected // 执行then的第二个参数 // 并把promisevalue传进来。    console.log("then,err",err)})

执行输出结果是:then,err,2

4.3 then的返回值

then()方法的返回值也是一个promise对象,所以它支持链式写法。但是要注意的是它的返回值是一个新的promise对象,与调用then方法的并不是同一个对象。

看下如下代码:​​​​​​​

var p1 = new Promise(()=>{});var p2 = p1.then(function f_ok(){},     function f_err(){}); // p2也是一个promise对象。
console.log(p1 === p2); // false

如上代码可以说明p1.then()的结果是一个与p1不同的promise对象。

 

换句话说,then()会封装一个全新的promise对象p2。那既然 p2也是一个promise对象,那么,p2的状态(promiseStatus)和值(promiseValue)分别是什么?

 

规则如下:

如果p1的状态是pending,则p2的状态也是pending。

•如果p1的状态是resolved,then()会去执行f_ok,则p2的状态由f_ok的返回值决定。

•如果f_ok返回值不是promise对象,则p2的状态是resolved,且p2的promiseValue就是f_ok函数的return值。•如果f_ok返回值是一个promise对象,则p2的状态及promiseValue以这个promise对象为准。•如果f_ok这个函数内部发生了错误(或者是用户主动抛出错误),则p2的状态是rejected,且p2的promiseValue就是这个错误对象。

如果p1的状态是rejected,then()会去执行f_err,则p2的状态由f_err的返回值决定。

•如果f_err返回值不是promise对象,则p2的状态是resolved,且p2的promiseValue就是f_err函数的return值。•如果f_err返回值是一个promise对象,则p2的状态及promiseValue以这个promise对象为准。

•如果f_err这个函数内部发生了错误(或者是用户主动抛出错误),则p2的状态是rejected,且p2的promiseValue就是这个错误对象。

 

 

示例代码1

p1与p2的状态相同。​​​​​​​

var p1 = new Promise(()=>{});var p2 = p1.then(function f_ok(){}, function f_err(){}); // p2也是一个promise对象。console.dir(p1);console.dir(p2);

示例代码2

​​​​​​​

var p1 = new Promise((resolve,reject)=>{   resolve()});var p2 = p1.then(function f_ok(){   return 1}, function f_err(){}); // p2也是一个promise对象。console.dir(p1);console.dir(p2);

 

p2的状态及值由f_ok来决定。 

 

特殊地,如果f_ok()中并没有return语句,则相当于是 return undefined。

示例代码3

f_ok返回一个全新的promise对象,则p2的状态及值由这个Promise对象来定。​​​​​​​

var p1 = new Promise((resolve,reject)=>{ resolve()});var p2 = p1.then(function f_ok(){    var temp = new Promise((resolve,reject)=>{ resolve({a:1}) });     return temp;}, function f_err(){});
console.dir(p2);

示例代码4

f_ok()中故意出错,则导致p2的状态是rejected,值就是错误对象。​​​​​​​

var p1 = new Promise((resolve,reject)=>{ resolve()});var p2 = p1.then(function f_ok(){    console.log(abc);// 这里故意犯错}, function f_err(){});
console.dir(p2);

示例代码5​​​​​​​

var p1 = new Promise((resolve,reject)=>{ reject(100)});var p2 = p1.then(function f_ok(){
}, function f_err(errVal){  var temp = new Promise((resolve,reject)=>{     resolve({b:errVal})   });   return temp;});
console.dir(p2);

示例代码6​​​​​​​

var p1 = new Promise((resolve,reject)=>{ reject(100)});var p2 = p1.then(function f_ok(){
}, function f_err(errVal){    throw new Error("aaa")}); console.dir(p2)

5 catch

5.1 catch()的格式及用法

Promise.prototype.catch 是 Promise.prototype.then(null, reject)的别名,用于指定当promise对象的状态从pending变成rejected的回调函数 。​​​​​​​

var p1 = new Promise((resolve,reject)=>{    reject('s')});
p1.catch(function(err){    console.log(err);})
// 与下面的代码等价p1.then(null, function(err){    console.log(err);})

单独使用catch没有什么意义,它一般与then一块使用。如下:​​​​​​​

new Promise((resolve,reject)=>{
}).then(function(result){    // 如果promise对象的状态是resolved的,就会到这里来,并且result会接收promiseValue的值}).catch(function(err){    // 如果promise对象的状态是rejected的,就会到这里来,并且err会接收promiseValue的值})
// 上面的代码如何拆分来写的话,等价于:var p1 = new Promise((resolve,reject){
});var p2 = p1.then(function(result){
});var p3 = p2.catch(function(err){
})

5.2 catch的返回值

catch的返回值仍是一个promise对象,确定它的值的方式与then(null,(errVal)=>{ })的方式一致。

6 finally()方法

Promise.prototype.finally() ,无论Promise的状态是resolved,还是rejected都会执行其中的回调函数(如果状态是pending的话,是不会执行的)。它的返回值还是一个promise,且保留了原promise对象的状态和值。​​​​​​​

var p1 = new Promise((resolve,reject)=>{ resolve(100)})var p2 = p1.finally(()=>{console.log('finally')})console.log(p1);console.log(p2);console.log(p1 === p2)

注意:(1)它的回调函数是没有执行的,不论该promise最终是fulfilled还是rejected,都会执行。(2)finally不改变promise的状态。

7 promise的链式调用

由于then,catch这两个方法的返回值都是promise对象,所以,它们很自然就可以链式调用了。 下面通过几个题目来分析一下链式调用的执行逻辑。

7.1 示例1​​​​​​​

function do1() {    console.log("任务1");}function do2() {    console.log("任务2");}function do3() {     console.log("任务3");}function do4() {    console.log("任务4");}
var p = new Promise((resolve,reject)=>{ resolve()})p.then(do1) .then(do2) .then(do3) .then(do4);

结果输出是:任务1,任务2,任务3,任务4​​​​​​​

var p1 = p.then(do1);var p2 = p1.then(do2)var p3 = p2.then(do3)var p4 = p3.then(do4)

第一步:由于p的状态是resolved,所以p.then(do1)中,do1函数会执行。输出任务1

第二步:确定p1的状态。按前面关于then的部分的介绍,p1的状态由do1()来决定。因为do1并没有明确指定返回值,则返回值就是undefined. p1的状态就是resolved。

第三步:由于p1的状态是resolved,所以p1.then(do2)会继续执行do2。输出任务2 ,且p2的状态由do2来决定。与第二步的分析相同,p2的状态仍是resolved。

第四步:接下来看p3。由于p2的状态是resolved,所以p2.then(do3)会继续执行do3。输出任务2 ,且p3的状态由do3来定,仍是resolved。

最后:p3.then(do4)。由于p3的状态是resolved,所以执行do4。输出任务4 。

7.2 示例2​​​​​​​

function do1() {    console.log("任务1");}function do2() {    console.log("任务2");}function do3() {     console.log("任务3");}function do4() {    console.log("任务4");}
var p = new Promise((resolve,reject)=>{ resolve()})p.then(do1) .then(do2) .catch(do3) .then(do4);

上面的代码的执行结果是:任务1, 任务2, 任务4。我们先把过程分解一下,多添加几个中间变量来描述它们的值:​​​​​​​

var p1 = p.then(do1);var p2 = p1.then(do2)var p3 = p2.catch(do3)var p4 = p3.then(do4)

分析如下:

第一步:由于p的状态是resolved,所以p.then(do1)中,do1函数会执行。输出任务1

第二步:确定p1的状态。按前面关于then的部分的介绍,p1的状态由do1()来决定。因为do1并没有明确指定返回值,则返回值就是undefined. p1的状态就是resolved。

第三步:由于p1的状态是resolved,所以p1.then(do2)会继续执行do2。输出任务2 ,且p2的状态由do2来决定。与第二步的分析相同,p2的状态仍是resolved。

第四步:接下来看p3。由于p2的状态是resolved,所以它并不会执行do3, p3的状态没有变化,仍保持p2的状态:resolved。

最后:p3.then(do4)。由于p3的状态是resolved,所以执行do4。输出任务4 。

7.3 示例3​​​​​​​

function do1() {    console.log("任务1");    console.log(abc); //故意犯错}function do2() {    console.log("任务2");}function do3() {     console.log("任务3");}function do4() {    console.log("任务4");}
var p = new Promise((resolve,reject)=>{ resolve()})p.then(do1) .then(do2) .then(do3) .catch(do4);

上面的代码的执行结果是:任务1, 任务4。我们先把过程分解一下,多添加几个中间变量来描述它们的值:​​​​​​​

var p1 = p.then(do1)var p2 = p1.then(do2)var p3 = p2.then(do3)var p4 = p3.catch(do4)

分析如下:

第一步:由于p的状态是resolved,所以p.then(do1)中,do1函数会执行,输出任务1,同时由于这里有段错误代码,所以p1的状态就是rejected。

第二步:由于p1的状态是rejected,所以p1.then(do2) 就不会执行do2,同时p2的状态也是rejected。

第三步:对p3的分析也是如此。

第四步:p3的状态是rejected,所以会执行do4。

7.4 示例4 传参​​​​​​​

function increment(value) {    return value + 1;}function doubleUp(value) {    return value * 2;}function output(value) {    console.log(value);// => (1 + 1) * 2}var p = Promise.resolve(1);p.then(increment) .then(doubleUp) .then(output)

上面代码的输出结果是 4。

拆分 之后,分析如下:​​​​​​​

// 状态:resolved; promiseValue: 1var p = Promise.resolve(1); 
// p的状态是resolved; // 在执行then的第一个参数,即increment时// 把p的 promiseValue 1 传入// increment执行后的返回值就是2// p1的状态是resolved,promiseValue是2 var p1 = p.then(increment); 
// p1的状态是resolved; // 在执行then的第一个参数,即doubleUp时// 把p1的promiseValue 2传入// doubleUp执行后的返回值就是4// p2的状态是resolved,promiseValue是4var p2 = p1.then(doubleUp); 
// p2的状态是resolved,promiseValue是4// 在执行then的第一个参数,即output时// 把p2的promiseValue传入,就是4var p3 = p2.then(output) ;

8 小结

本文介绍了promise对象的三个原型方法,重点分析了then方法的参数执行逻辑及返回值,最后分析了promise对象链式用法的执行步骤。希望对你有帮助。

King十三
关注 关注
  • 10
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ES6 Promise用法小结
涂涂
07-25 39万+
目录 1.什么是Promise reject的用法 catch的用法 all的用法 race的用法 1.什么是Promise Promise 是异步编程的一种解决方案,其实是一个构造函数,自己身上有all、reject、resolve这几个方法,原型上有then、catch等方法。 Promise对象有以下两个特点。 (1)对象的状态不受外界影响。Promise对象代表一个异步操...
Promise链式调用解决多个异步回调
qq_36711388的博客
03-24 2541
项目中需要先获取用户的ID,然后再根据用户ID去获取用户的详细信息。这里获取用户IDlogin()和获取用户信息getUser()都是调用接口的异步请求。在获取用户的详细信息之前,需要先获得用户ID。也就是说getUser依赖于login的状态。 一:promise.all()   Promise.all([axios1,axios2,axios3]),用于将多个Promise实例,包装成...
Promise对象的链式调用(解决异步回调嵌套)
03-29
Promise对象是解决异步回调嵌套的一种方案,现在封装Promise的库很多、像q,bluebrid等等。Promise对象下调用.then方法就可以把异步排个顺序,那么只要返回Promise对象、.then就可以继续下去 首先我们定义三个异步方法 var test ={         func1:function(){                 var data = new Promise(function(resolve){                         setTimeout(function(){                                
JavaScript异步编程——08-Promise链式调用【万字长文,感谢支持】
——心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,谦虚,自律,反思,成长,还算是比较正能量的博主,公益免费传播……内心特别想在AI界做出一些可以推进历史进程影响力的东西(兴趣使然,有点小情怀,也有点使命感呀)…
05-11 1254
史诗级JavaScript异步编程学习,快来订阅专栏吧!
什么是Promise链?它在异步编程中的作用是什么?
最新发布
一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟!
07-22 935
基本概念和作用说明示例一:基础的Promise链示例二:错误处理与链式调用示例三:并行处理与链式调用结合实际工作开发中的使用技巧结合经验的深入分析在现代前端开发中,异步编程是不可或缺的一部分,而Promise作为一种处理异步操作的模式,已经逐渐成为了JavaScript中的标准。Promise不仅可以简化异步代码的编写,还能通过Promise链的方式串联多个异步操作,形成优雅且易于维护的代码结构。本文将深入探讨Promise
Promise链式调用
流绪@微梦
01-22 903
实际开发中,我们经常需要同时请求多个接口。比如说:在请求完接口1的数据data1之后,需要根据data1的数据,继续请求接口 2,获取data2;然后根据data2的数据,继续请求接口 3。换而言之,现在有三个网络请求,请求 2 必须依赖请求 1 的结果,请求 3 必须依赖请求 2 的结果,如果按照往常的写法,会有三层回调,会陷入“回调地狱”。这种场景其实就是接口的多层嵌套调用。有了 Promise 之后,我们可以把多层嵌套调用按照线性的方式进行书写,非常优雅。
Promise链式调用
ywCSD的博客
09-08 4058
promise详解 promise对象是一个构造函数,用于生成Promise实例。对象状态不受外界影响,只有异步操作的结果才能决定当前是哪一种状态。三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)。实例生成以后,用then方法分别指定resolved状态和rejected状态的回调函数 Promise链式调用 先看一段代码: 你可能想到的结果是12345,可是打印结果是:1,2,3,5,4Why? 结论 0.回调是异步的 ...
AJAX——Promise-链式调用
weixin_48719464的博客
04-23 999
概念:依靠then()方法会返回一个新生成的Promise对象特性,继续串联下一环任务,知道结束细节:then()回调函数中的返回值,会影响新生成的Promise对象最终状态和结果好处:通过链式调用,解决回调函数嵌套问题。
使用Promise链式调用解决多个异步回调的问题
08-31
Promise链式调用Promise的核心特性之一,它可以让我们组织代码结构更加清晰,易于理解和维护。 Promise是一个对象,代表一个可能还没有完成,但将来可能会完成的异步操作的结果。这个结果可能是成功的值,也可能...
详解ES6 Promise对象then方法链式调用
10-17
这个例子展示了then方法链式调用的基本用法,也显示了如何在链式调用中处理返回值。 在另一个示例中,我们在第一个then方法中返回了另一个Promise对象,这个对象同样通过setTimeout设置了解决操作。这次,在第二个...
07-Promise链式调用
biancheng_的博客
12-11 1312
上面的代码中,每次在 return 一个 promise 的时候,只是 url 地址不一样,其他的代码是一样的。上面代码中,then 是可以链式调用的,一旦 return 一个新的 promise 实例之后,后面的 then 就可以拿到前面 resolve 出来的数据。换而言之,现在有三个网络请求,请求 2 必须依赖请求 1 的结果,请求 3 必须依赖请求 2 的结果,如果按照往常的写法,会有三层回调,会陷入“回调地狱”。这种代码要怎么写呢?上面的代码中,假设 a 请求失败,那么,后面的代码会怎么走呢?
Promise链式调用三种写法,Promise.all与式调用
Java_53的博客
06-04 2573
Promise链式调用三种写法: // 1,Promise原始链式调用 new Promise((resolve, reject) => { setTimeout(() => { console.log("请求结果:", 1); resolve(1); }, 1000) }).then((data) => { console.log("第一次对结果处理"); return new Promise((resolve, reje
彻底掌握 Promise-原生Promise的实现(二) Promise链式调用
记得抬头微笑
03-23 5973
在 彻底掌握 Promise- 原生 Promise 的实现(一)已经初步实现了 promise 的简易版本,这距离实现完整版本的 Promise 还有一段距离,下面我们将在简易版本的基础上增加 Promise链式调用 异步情况下 Promise链式调用 处理函数执行的异常情况 以下代码都是对简易版本 Promise 去实现的,所以这里只显示变更的地方,完整版本在文末贴出 Promise链式调用 下面我们依然还是通过逆解析的方式去通过 Promise链式调用用法.....
JavaScript:Promise链式调用
Hr_ving的博客
06-10 3703
Promise链式调用
promise链式操作
不想内卷的博客
08-11 500
promise用来封装异步操作并可以获得其成功和失败的结果,我们首先看看正常的Promise是怎么样的 //实例化对象 const p=new Promise(function (resolve,reject) { let data='数据库中的用户数据'; //原生ajax请求,没有接口就先不用这个了,但是我们可以这么李姐 // var xhr = new XMLHttpRequest(); // xh
promise 链式调用
weixin_39537579的博客
08-15 3934
一般遇到的promise使用方式很少接触到链式调用,今天看了些文章,故写了个例子来理解 链式操作一般的应用场景是后面的then需要前面的then(前面的then应该也是个异步操作,因为若不是异步操作,就可以将代码直接写在前一then里,不需要第二个then)的返回值,故前面的then也需要返回的是promise对象。 const p = new Promise((resolve, rejec...
ES6之Promise链式调用
俊刚的博客
01-02 1831
Promise链式调用是指在一个Promise对象上连续调用多个then方法的过程。通过链式调用,可以将多个异步操作按照顺序执行,并且可以在每个操作完成后处理返回的结果。 - 当使用Promise进行链式调用时,每个then方法都可以接收两个参数:一个是成功回调函数,一个是失败回调函数。成功回调函数用于处理上一个Promise对象的成功状态,而失败回调函数用于处理上一个Promise对象的失败状态。
详解Promise链式写法
qq_45153972的博客
06-07 567
详细解释了Promise为什么可以用链式的写法,讲解了then,catch方法返回了什么
封装一个promise链式调用方法
04-03
以下是一个简单的promise链式调用方法的封装示例: ``` function chainPromises(promises) { return promises.reduce((previousPromise, currentPromise) => { return previousPromise.then(() => currentPromise()); }, Promise.resolve()); } ``` 该方法接受一个promise数组作为参数,依次执行每个promise并等待其完成,然后再执行下一个promise。使用方法如下: ``` const promises = [ () => { return new Promise((resolve, reject) => { setTimeout(() => { console.log('Promise 1 resolved'); resolve(); }, 1000); }); }, () => { return new Promise((resolve, reject) => { setTimeout(() => { console.log('Promise 2 resolved'); resolve(); }, 2000); }); }, () => { return new Promise((resolve, reject) => { setTimeout(() => { console.log('Promise 3 resolved'); resolve(); }, 3000); }); } ]; chainPromises(promises).then(() => { console.log('All promises resolved'); }); ``` 该示例将创建3个promise,每个promise分别在1秒、2秒和3秒后解析,并在解析后打印一条消息。然后,它使用`chainPromises`方法依次执行这些promise,并在所有promise解析后打印一条消息。
写文章

热门文章

  • 什么是BFC,他有什么用? 34333
  • 常见HTTP请求错误码 200-301-302-304-400-404 15251
  • vue3-setup-基本使用 10053
  • vue3-setup-基本使用-理解它的作用 9064
  • promise的链式用法详细 7142

最新评论

  • promise的链式用法详细

    a2924058198: 例子很好

  • promise.then的9道练习题-我猜你不能全对

    曾平安: promise这几篇写的真好

  • 什么是BFC,他有什么用?

    .TT.: BFC内部的任何操作不会影响到外部,这个外部指的是父盒子以外,还是被操作的子盒子以外的任何元素?

  • js高级-定义一个不能修改的对象

    qq_34610549: ``` enum settings = { appName = "a" }; ``` 枚举解君愁

  • 什么是BFC,他有什么用?

    Ding__y: 写的太棒了, 通俗易懂。写的太棒了, 通俗易懂!!

最新文章

  • vue2.0 Element UI - Tag标签页
  • vue2.0 登录页面-包含校验
  • vue2.0 - layout组件(六)面包屑组件布局
2022年10篇
2021年36篇
2020年36篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家玻璃钢酒店人物雕塑厂家地址惠州玻璃钢雕塑批发威海火烈鸟玻璃钢雕塑生产厂家玻璃钢雕塑哪家买玻璃钢雕塑厂家定做大型玻璃钢花盆模具制作毕节玻璃钢景观雕塑报价徐州湛江玻璃钢动物雕塑标识玻璃钢仿铜雕塑制作武汉商场国潮美陈龙玻璃钢雕塑图片苏州玻璃钢雕塑厂西宁广场玻璃钢雕塑多少钱抚顺玻璃钢雕塑厂安阳玻璃钢商场美陈玻璃钢雕塑材料制作视频平度玻璃钢花盆花器雕塑玻璃钢小黄人单县制作玻璃钢雕塑商家厂商盐城玻璃钢雕塑定制常州玻璃钢动漫卡通雕塑设计观音玻璃钢雕塑制作雕塑建筑装饰玻璃钢模具招聘大理市玻璃钢雕塑厂家南宁玻璃钢雕塑供应商广东酒店艺术玻璃钢雕塑厂家铜陵水果玻璃钢雕塑生产厂家商场美陈创意设计软件潮州玻璃钢花盆美陈用品商场香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化