Promise如何在Javascript中使用-創(chuàng)新互聯(lián)

本篇文章為大家展示了Promise如何在Javascript中使用,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)為您提適合企業(yè)的網(wǎng)站設(shè)計(jì)?讓您的網(wǎng)站在搜索引擎具有高度排名,讓您的網(wǎng)站具備超強(qiáng)的網(wǎng)絡(luò)競(jìng)爭(zhēng)力!結(jié)合企業(yè)自身,進(jìn)行網(wǎng)站設(shè)計(jì)及把握,最后結(jié)合企業(yè)文化和具體宗旨等,才能創(chuàng)作出一份性化解決方案。從網(wǎng)站策劃到成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè), 我們的網(wǎng)頁(yè)設(shè)計(jì)師為您提供的解決方案。

什么是 Promise?

首先我們來了解 Promise 到底是怎么一回事

Promise 是抽象的異步處理對(duì)象,以及對(duì)其進(jìn)行各種操作的組件。我知道這樣解釋你肯定還是不明白 Promise 是什么東西,你可以把 Promise 理解成一個(gè) 容器,里面裝著將來才會(huì)結(jié)束的一個(gè)事件的結(jié)果,這個(gè)事件通常是一個(gè)異步操作。

Promise最初被提出是在 E語(yǔ)言中, 它是基于并列/并行處理設(shè)計(jì)的一種編程語(yǔ)言。Javascript 在 ES6 之后也開始支持 Promise 特性了,用來解決異步操 的問題。這里順便解釋一下什么是 ES6, ECMAScript 是 Javascript 語(yǔ)言的國(guó)際標(biāo)準(zhǔn),Javascript 是 ECMAScript 的有一個(gè)實(shí)現(xiàn), 而ES6(全稱 ECMAScript 6)是這個(gè)標(biāo)準(zhǔn)的一個(gè)版本。

3、Javascript 為什么要引入 Promise?

細(xì)心的你可能發(fā)現(xiàn)了我剛剛說了 Javascript 支持 Promise 實(shí)現(xiàn)是為了解決異步操作的問題。談到異步操作,你可能會(huì)說,Javascript 不是可以用回調(diào) 函數(shù)處理異步操作嗎? 原因就是 Promise 是一種更強(qiáng)大的異步處理方式,而且她有統(tǒng)一的 API 和規(guī)范,下面分別看看傳統(tǒng)處理異步操作和 Promise 處理 異步操作有哪些不同。

使用回調(diào)函數(shù)處理異步操作:

login("http://www.r9it.com/login.php", function(error, result){
  // 登錄失敗處理
 if(error){
    throw error;
  }
  // 登錄成功時(shí)處理
});

Node.js等則規(guī)定在JavaScript的回調(diào)函數(shù)的第一個(gè)參數(shù)為 Error 對(duì)象,這也是它的一個(gè)慣例。 像上面這樣基于回調(diào)函數(shù)的異步處理如果統(tǒng)一參數(shù)使用規(guī)則的話,寫法也會(huì)很明了。 但是,這也僅是編碼規(guī)約而已,即使采用不同的寫法也不會(huì)出錯(cuò)。 而Promise則是把類似的異步處理對(duì)象和處理規(guī)則進(jìn)行規(guī)范化, 并按照采用統(tǒng)一的接口來編寫,而采取規(guī)定方法之外的寫法都會(huì)出錯(cuò)。

使用 Promise 處理異步操作:

var promise = loginByPromise("http://www.r9it.com/login.php"); 
promise.then(function(result){
  // 登錄成功時(shí)處理
}).catch(function(error){
  // 登錄失敗時(shí)處理
});

通過上面兩個(gè) demo 你會(huì)發(fā)現(xiàn),有了Promise對(duì)象,就可以將異步操作以同步操作的流程表達(dá)出來。 這樣在處理多個(gè)異步操作的時(shí)候還可以避免了層層嵌套的回調(diào)函數(shù)(后面會(huì)有演示)。 此外,Promise對(duì)象提供統(tǒng)一的接口,必須通過調(diào)用 Promise#then Promise#catch 這兩個(gè)方法來結(jié)果,除此之外其他的方法都是不可用的,這樣使得異步處理操作更加容易。

4、基本用法

在 ES6 中,可以使用三種辦法創(chuàng)建 Promise 實(shí)例(對(duì)象)

(1). 構(gòu)造方法

let promies = new Promise((resolve, reject) => {
 resolve(); //異步處理 
});

Promise 構(gòu)造函數(shù)接受一個(gè)函數(shù)作為參數(shù),該函數(shù)的兩個(gè)參數(shù)分別是 resolve 和 reject。它們是兩個(gè)函數(shù),由 JavaScript 引擎提供,不用自己部署。

(2). 通過 Promise 實(shí)例的方法,Promise#then 方法返回的也是一個(gè) Promise 對(duì)象

promise.then(onFulfilled, onRejected);

(3). 通過 Promise 的靜態(tài)方法,Promise.resolve(),Promise.reject()

var p = Promise.resolve();
p.then(function(value) {
 console.log(value); 
});

4.1 Promise 的執(zhí)行流程

  1. new Promise構(gòu)造器之后,會(huì)返回一個(gè)promise對(duì)象;

  2. 為 promise 注冊(cè)一個(gè)事件處理結(jié)果的回調(diào)函數(shù)(resolved)和一個(gè)異常處理函數(shù)(rejected);

4.2 Promise 的狀態(tài)

實(shí)例化的 Promise 有三個(gè)狀態(tài):

Fulfilled: has-resolved, 表示成功解決,這時(shí)會(huì)調(diào)用 onFulfilled.

Rejected: has-rejected, 表示解決失敗,此時(shí)會(huì)調(diào)用 onRejected.

Pending: unresolve, 表示待解決,既不是resolve也不是reject的狀態(tài)。也就是promise對(duì)象剛被創(chuàng)建后的初始化狀態(tài).

上面我們提到 Promise 構(gòu)造函數(shù)接受一個(gè)函數(shù)作為參數(shù),該函數(shù)的兩個(gè)參數(shù)分別是 resolve 和 reject.

resolve函數(shù)的作用是,將 Promise 對(duì)象的狀態(tài)從 未處理 變成 處理成功 (unresolved => resolved), 在異步操作成功時(shí)調(diào)用,并將異步操作的結(jié)果作為參數(shù)傳遞出去。

reject函數(shù)的作用是,將 Promise 對(duì)象的狀態(tài)從 未處理 變成 處理失敗 (unresolved => rejected), 在異步操作失敗時(shí)調(diào)用,并將異步操作報(bào)出的錯(cuò)誤,作為參數(shù)傳遞出去。

Promise 實(shí)例生成以后,可以用 then 方法和 catch 方法分別指定 resolved 狀態(tài)和 rejected 狀態(tài)的回調(diào)函數(shù)。

以下是 Promise 的狀態(tài)圖

Promise如何在Javascript中使用

4.3 Promise 的基本特性

【1】 對(duì)象的狀態(tài)不受外界影響 Promise 對(duì)象代表一個(gè)異步操作,有三種狀態(tài):pending(進(jìn)行中)、fulfilled(已成功)和rejected(已失敗)。 只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài),任何其他操作都無法改變這個(gè)狀態(tài)。 這也是Promise這個(gè)名字的由來,它的英語(yǔ)意思就是“承諾”,表示其他手段無法變。

【2】 一旦狀態(tài)改變,就不會(huì)再變,任何時(shí)候都可以得到這個(gè)結(jié)果 Promise對(duì)象的狀態(tài)改變,只有兩種可能:從 pending 變?yōu)?fulfilled 和從 pending 變?yōu)?rejected。 只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會(huì)再變了,會(huì)一直保持這個(gè)結(jié)果,這時(shí)就稱為 resolved(已定型)。 如果改變已經(jīng)發(fā)生了,你再對(duì) Promise 對(duì)象添加回調(diào)函數(shù),也會(huì)立即得到這個(gè)結(jié)果。 這與事件(Event)完全不同,事件的特點(diǎn)是,如果你錯(cuò)過了它,再去監(jiān)聽,是得不到結(jié)果的。

例如以下代碼, reject 方法是無效的

var promise = new Promise((fuck, reject) => {
 resolve("xxxxx");
 //下面這行代碼無效,因?yàn)榍懊?nbsp;resolve 方法已經(jīng)將 Promise 的狀態(tài)改為 resolved 了
 reject(new Error()); 
});

promise.then((value) => { 
 console.log(value);
})

下圖是 Promise 的狀態(tài)處理流程圖

Promise如何在Javascript中使用

5、Promise 的執(zhí)行順序

我們知道 Promise 在創(chuàng)建的時(shí)候是立即執(zhí)行的,但是事實(shí)證明 Promise 只能執(zhí)行異步操作,即使在創(chuàng)建 Promise 的時(shí)候就立即改變它狀態(tài)。

var p = new Promise((resolve, reject) => {
 console.log("start Promise");
 resolve("resolved"); 
});

p.then((value) => {
 console.log(value);
}) 

console.log("end Promise");

打印的結(jié)果是:

start Promise
end Promise
resolved

或許你會(huì)問,這個(gè)操作明明是同步的,定義 Promise 里面的代碼都被立即執(zhí)行了,那么回調(diào)應(yīng)該緊接著 resolve 函數(shù)執(zhí)行,那么應(yīng)該先打印 “resolved” 而不應(yīng)該先打印 “end Promise”.

這個(gè)是 Promise 規(guī)范規(guī)定的,為了防止同步調(diào)用和異步調(diào)用同時(shí)存在導(dǎo)致的混亂

6、Promise 的鏈?zhǔn)秸{(diào)用(連貫操作)

前面我們講過,Promise 的 then 方法以及 catch 方法返回的都是新的 Promise 對(duì)象,這樣我們可以非常方便的解決嵌套的回調(diào)函數(shù)的問題, 也可以很方便的實(shí)現(xiàn)流程任務(wù)。

var p = new Promise(function(resolve, reject) {
  resolve();
});
function taskA() {
  console.log("Task A");
}
function taskB() {
  console.log("Task B");
}
function taskC() {
  console.log("Task C");
}
p.then(taskA())
.then(taskB())
.then(taskC())
.catch(function(error) {
  console.log(error);
});

上面這段代碼很方便的實(shí)現(xiàn)了從 taskA 到 taskC 的有序執(zhí)行。

當(dāng)然你可以把 taskA - taskC 換成任何異步操作,如從后臺(tái)獲取數(shù)據(jù):

var getJSON = function(url, param) {
 var promise = new Promise(function(resolve, reject){
 var request = require('ajax-request');
 request({url:url, data: param}, function(err, res, body) {
  if (!err && res.statusCode == 200) {
  resolve(body);
  } else {
  reject(new Error(err));
  }
 });
 });

 return promise;
};
var url = "login.php";
getJSON(url, {id:1}).then(result => {
 console.log(result);
 return getJSON(url, {id:2})
}).then(result => {
 console.log(result);
 return getJSON(url, {id:3});
}).then(result => {
 console.log(result);
}).catch(error => console.log(error));

這樣用起來似乎很爽,但是有個(gè)問題需要注意,我們說過每個(gè) then() 方法都返回一個(gè)新的 Promise 對(duì)象,那既然是 Promise 對(duì)象,那肯定就有注冊(cè) onFulfilled 和 onRejected, 如果某個(gè)任務(wù)流程的 then() 方法鏈過長(zhǎng)的話,前面的任務(wù)拋出異常,會(huì)導(dǎo)致后面的任務(wù)被跳過。

function taskA() {
  console.log("Task A");
  throw new Error("throw Error @ Task A");
}
function taskB() {
  console.log("Task B");
}
function onRejected(error) {
  console.log(error);
}
function finalTask() {
  console.log("Final Task");
}
var promise = Promise.resolve();
promise
  .then(taskA)
  .then(taskB)
  .catch(onRejected)
  .then(finalTask);

執(zhí)行的結(jié)果是:

Task A
Error: throw Error @ Task A
Final Task

顯然, 由于 A 任務(wù)拋出異常(執(zhí)行失敗),導(dǎo)致 .then(taskB) 被跳過,直接進(jìn)入 .catch 異常處理環(huán)節(jié)。

6.1 promise chain 中如何傳遞參數(shù)

上面我們簡(jiǎn)單闡述了 Promise 的鏈?zhǔn)秸{(diào)用,能夠非常有效的處理異步的流程任務(wù)。

但是在實(shí)際的使用場(chǎng)景中,任務(wù)之間通常都是有關(guān)聯(lián)的,比如 taskB 需要依賴 taskA 的處理結(jié)果來執(zhí)行,這有點(diǎn)類似 Linux 管道機(jī)制。 Promise 中處理這個(gè)問題也很簡(jiǎn)單,那就是在 taskA 中 return 的返回值,會(huì)在 taskB 執(zhí)行時(shí)傳給它。

function taskA() {
  console.log("Task A");
  return "From Task A";
}
function taskB(value) {
 console.log(value);
  console.log("Task B");
  return "From Task B";
}
function onRejected(error) {
  console.log(error);
}
function finalTask(value) {
 console.log(value);
  console.log("Final Task");
}
var promise = Promise.resolve();
promise
  .then(taskA)
  .then(taskB)
  .catch(onRejected)
  .then(finalTask);

搞定,就這么簡(jiǎn)單!

6.2 resolve 和 reject 參數(shù)

reject函數(shù)的參數(shù)通常是Error對(duì)象的實(shí)例,表示拋出的錯(cuò)誤;resolve函數(shù)的參數(shù)除了正常的值以外,還可能是另一個(gè) Promise 實(shí)例, 比如像上面的 getJSON() 方法一樣。

var p1 = new Promise(function (resolve, reject) {
 setTimeout(() => reject(new Error('fail')), 3000)
})

var p2 = new Promise(function (resolve, reject) {
 setTimeout(() => resolve(p1), 1000)
})

p2
 .then(result => console.log(result))
 .catch(error => console.log(error))

注意,這時(shí)p1的狀態(tài)就會(huì)傳遞給p2,也就是說,p1的狀態(tài)決定了p2的狀態(tài)。

如果p1的狀態(tài)是 pending,那么p2的回調(diào)函數(shù)就會(huì)等待p1的狀態(tài)改變;

如果p1的狀態(tài)已經(jīng)是 resolved 或者 rejected,那么p2的回調(diào)函數(shù)將會(huì)立刻執(zhí)行。

7、Promise 基本方法

ES6的Promise API提供的方法不是很多,下面介紹一下 Promise 對(duì)象常用的幾個(gè)方法.

7.1 Promise.prototype.catch()

Promise.prototype.catch方法是.then(null, rejection)的別名,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。

p.then((val) => console.log('fulfilled:', val))
 .catch((err) => console.log('rejected', err));

// 等同于
p.then((val) => console.log('fulfilled:', val))
 .then(null, (err) => console.log("rejected:", err));

Promise 對(duì)象的錯(cuò)誤具有“冒泡”性質(zhì),會(huì)一直向后傳遞,直到被捕獲為止。也就是說,錯(cuò)誤總是會(huì)被下一個(gè)catch語(yǔ)句捕獲。 所以通常建議使用 catch 方法去捕獲異常,而不要用 then(null, function(error) {}) 的方式,因?yàn)檫@樣只能捕獲當(dāng)前 Promise 的異常

p.then(result => {console.log(result)})
 .then(result => {console.log(result)})
 .then(result => {console.log(result)})
 .catch(error => {
  //捕獲上面三個(gè) Promise 對(duì)象產(chǎn)生的異常
  console.log(error);
 });

跟傳統(tǒng)的try/catch代碼塊不同的是,如果沒有使用catch方法指定錯(cuò)誤處理的回調(diào)函數(shù),Promise 對(duì)象拋出的錯(cuò)誤不會(huì)傳遞到外層代碼,即不會(huì)有任何反應(yīng)。

通俗的說法就是“Promise 會(huì)吃掉錯(cuò)誤”。

比如下面的代碼就出現(xiàn)這種情況

var p = new Promise(function(resolve, reject) {
  // 下面一行會(huì)報(bào)錯(cuò),因?yàn)閤沒有聲明
  resolve(x + 2);
 });
p.then(() => {console.log("every thing is ok.");});
// 這行代碼會(huì)正常執(zhí)行,不會(huì)受 Promise 里面報(bào)錯(cuò)的影響
console.log("Ok, it's Great.");

7.2 Promise.all()

Promise.all方法用于將多個(gè) Promise 實(shí)例,包裝成一個(gè)新的 Promise 實(shí)例。用來處理組合 Promise 的邏輯操作。

var p = Promise.all([p1, p2, p3]);

上面代碼 p 的狀態(tài)由p1、p2、p3決定,分成兩種情況。

  1. 只有p1、p2、p3的狀態(tài)都變成fulfilled,p的狀態(tài)才會(huì)變成fulfilled,此時(shí)p1、p2、p3的返回值組成一個(gè)數(shù)組,傳遞給p的回調(diào)函數(shù)。

  2. 只要p1、p2、p3之中有一個(gè)被rejected,p的狀態(tài)就變成rejected,此時(shí)第一個(gè)被reject的實(shí)例的返回值,會(huì)傳遞給p的回調(diào)函數(shù)。

下面是一個(gè)具體的例子

// 生成一個(gè)Promise對(duì)象的數(shù)組
var promises = [1,2,3,4,5,6].map(function (id) {
 return getJSON('/post/' + id + ".json");
});

Promise.all(promises).then(function (posts) {
 // ...
}).catch(function(reason){
 // ...
});

上面代碼中,promises 是包含6個(gè) Promise 實(shí)例的數(shù)組,只有這6個(gè)實(shí)例的狀態(tài)都變成 fulfilled,或者其中有一個(gè)變?yōu)?rejected, 才會(huì)調(diào)用 Promise.all 方法后面的回調(diào)函數(shù)。

7.3 Promise.race()

Promise.race方法同樣是將多個(gè)Promise實(shí)例,包裝成一個(gè)新的Promise實(shí)例。 與 Promise.all 不同的是,只要有一個(gè) promise 對(duì)象進(jìn)入 FulFilled 或者 Rejected 狀態(tài)的話,Promise.rece 就會(huì)繼續(xù)進(jìn)行后面的處理

var p = Promise.race([p1, p2, p3]);

上面代碼中,只要p1、p2、p3之中有一個(gè)實(shí)例率先改變狀態(tài),p的狀態(tài)就跟著改變。那個(gè)率先改變的 Promise 實(shí)例的返回值,就傳遞給p的回調(diào)函數(shù)。 Promise.race 方法的參數(shù)與 Promise.all 方法一樣,如果不是 Promise 實(shí)例,就會(huì)先調(diào)用 Promise.resolve 方法, 將參數(shù)轉(zhuǎn)為 Promise 實(shí)例,再進(jìn)一步處理。

下面是一個(gè)具體的例子

// `delay`毫秒后執(zhí)行resolve
function timerPromisefy(delay) {
  return new Promise(function (resolve) {
    setTimeout(function () {
      resolve(delay);
    }, delay);
  });
}
// 任何一個(gè)promise變?yōu)閞esolve或reject 的話程序就停止運(yùn)行
Promise.race([
  timerPromisefy(1),
  timerPromisefy(32),
  timerPromisefy(64),
  timerPromisefy(128)
]).then(function (value) {
  console.log(value);  // => 1
});

7.4 Promise.resolve()

Promise.resolve 方法有2個(gè)作用,一個(gè)就是前面我們說的,它是通過靜態(tài)方法創(chuàng)建 Promise 實(shí)例的渠道之一, 另一個(gè)作用就是將 Thenable 對(duì)象轉(zhuǎn)換為 Promise 對(duì)象。

那么什么是 Thenable 對(duì)象呢?ES6 Promises里提到了Thenable這個(gè)概念,簡(jiǎn)單來說它就是一個(gè)非常類似promise的東西。 就像我們有時(shí)稱具有 .length 方法的非數(shù)組對(duì)象為 Array like 一樣,Thenable 指的是一個(gè)具有 .then 方法的對(duì)象。

這種將 Thenable對(duì)象轉(zhuǎn)換為 Promise 對(duì)象的機(jī)制要求thenable對(duì)象所擁有的 then 方法應(yīng)該和Promise所擁有的 then 方法具有同樣的功能和處理過程, 在將 Thenable 對(duì)象轉(zhuǎn)換為 Promise 對(duì)象的時(shí)候,還會(huì)巧妙的利用 Thenable 對(duì)象原來具有的 then 方法。

到底什么樣的對(duì)象能算是 Thenable 的呢,最簡(jiǎn)單的例子就是 jQuery.ajax(),它的返回值就是 Thenable 的。

將 Thenable 對(duì)象轉(zhuǎn)換為 Promise 對(duì)象

var promise = Promise.resolve($.ajax('/json/comment.json'));// => promise對(duì)象
promise.then(function(value){
  console.log(value);
});

除了上面的方法之外,Promise.resolve方法的參數(shù)還有以下三種情況。

(1). 參數(shù)是一個(gè) Promise 實(shí)例

如果參數(shù)是Promise實(shí)例,那么Promise.resolve將不做任何修改、原封不動(dòng)地返回這個(gè)實(shí)例。

(2). 參數(shù)不是具有then方法的對(duì)象,或根本就不是對(duì)象

如果參數(shù)是一個(gè)原始值,或者是一個(gè)不具有then方法的對(duì)象,則Promise.resolve方法返回一個(gè)新的Promise對(duì)象,狀態(tài)為resolved。

var p = Promise.resolve('Hello');
p.then(function (s){
 console.log(s)
});

上面代碼生成一個(gè)新的Promise對(duì)象的實(shí)例p。由于字符串Hello不屬于異步操作(判斷方法是字符串對(duì)象不具有then方法), 返回Promise實(shí)例的狀態(tài)從一生成就是resolved,所以回調(diào)函數(shù)會(huì)立即執(zhí)行。 Promise.resolve方法的參數(shù),會(huì)同時(shí)傳給回調(diào)函數(shù)。

(3). 不帶有任何參數(shù)

Promise.resolve方法允許調(diào)用時(shí)不帶參數(shù),直接返回一個(gè)resolved狀態(tài)的Promise對(duì)象。這個(gè)我們?cè)谏厦嬷v創(chuàng)建 Promise 實(shí)例的三種方法的時(shí)候就講過了

var p = Promise.resolve();
p.then(function () {
 // ...
});

7.5 Promise.reject()

Promise.reject(reason)方法也會(huì)返回一個(gè)新的 Promise 實(shí)例,該實(shí)例的狀態(tài)為rejected。 需要注意的是,Promise.reject()方法的參數(shù),會(huì)原封不動(dòng)地作為 reject 的理由,變成后續(xù)方法的參數(shù)。這一點(diǎn)與 Promise.resolve 方法不一致。

const thenable = {
 then(resolve, reject) {
  reject('出錯(cuò)了');
 }
};

Promise.reject(thenable)
.catch(e => {
 console.log(e === thenable)
})
// true

上面代碼中,Promise.reject 方法的參數(shù)是一個(gè) thenable 對(duì)象,執(zhí)行以后,后面 catch 方法的參數(shù)不是 reject 拋出的“出錯(cuò)了”這個(gè)字符串, 而是 thenable 對(duì)象。

上述內(nèi)容就是Promise如何在Javascript中使用,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前標(biāo)題:Promise如何在Javascript中使用-創(chuàng)新互聯(lián)
分享URL:http://www.bm7419.com/article18/ihdgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版網(wǎng)站排名、建站公司、響應(yīng)式網(wǎng)站、網(wǎng)站建設(shè)、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)