關(guān)于 Promise的基本用法,你知道哪些?快來一起學(xué)習(xí)吧。下面小編就和大家分享,來欣賞一下吧。
Promise的基本用法
Promise是一個(gè)類,可以創(chuàng)建一個(gè)實(shí)例, Promise,也是一個(gè)對(duì)象,用來傳遞異步操作的消息。
Promise有三個(gè)狀態(tài):
penging(對(duì)象的初始狀態(tài),等到任務(wù)的完成或者被拒絕)
fulfilled (任務(wù)執(zhí)行完成并且成功的狀態(tài))
rejuce(任務(wù)執(zhí)行完成并且失敗的狀態(tài))
Promise對(duì)象有以下兩個(gè)特點(diǎn):
1)對(duì)象的狀態(tài)不受外界影響。
2) 一旦狀態(tài)改變,就不會(huì)再變, Promise的狀態(tài)只可能從“pending”狀態(tài)轉(zhuǎn)到“fulfilled”狀態(tài)或者“pejected”狀態(tài),而且不能逆向轉(zhuǎn)換.
缺點(diǎn):
1)無法取消 Promise,一旦新建它就會(huì)立即執(zhí)行,無法中途取消。
2)如果不設(shè)置回調(diào)函數(shù),Promise 內(nèi)部拋出的錯(cuò)誤,不會(huì)反應(yīng)到外部。
Promise的用法
Promise的構(gòu)造函數(shù)接收一個(gè)參數(shù),是函數(shù),并且傳入兩個(gè)參數(shù):resolve,reject,
分別表示異步操作執(zhí)行成功后的回調(diào)函數(shù)和異步操作執(zhí)行失敗后的回調(diào)函數(shù)。
var promise = new Promise(function(resolve, reject) {
if (/.異步操作成功 .){
resolve(value);
} else {
reject(error);
}
});
//then里面的函數(shù)就跟我們平時(shí)的回調(diào)函數(shù),不管上面的是什么結(jié)果,都會(huì)走then里面。
promise .then(function (value){
console.log('成功',value);
},function(reason){
console.log('失敗',reason);
})
Promise還提供了all,race、reject、resolve等方法
promise鏈?zhǔn)秸{(diào)用:會(huì)將前一個(gè)then的返回值(return)作為下一次成功的回調(diào)函數(shù)的參數(shù)。
promise.all方法:可以傳入多個(gè)promise ,全部執(zhí)行后將結(jié)果以數(shù)組的方式返回,如果有一個(gè)失敗了,就失敗了
promise.race方法:就是賽跑的意思。race的用法與all一樣,誰的時(shí)間快就實(shí)行哪個(gè)函數(shù)
下面就是的小例子(字符串的倒敘),來講解promise.all方法和promise.race方法
let p1 =new Promise(function (resolve,reject) {
let str1 ='123456789'; //定義一個(gè)字符串
let leg = str1.length; //獲取字符串的長度
let re =''; //存儲(chǔ)返回值
let i =1; //初始循環(huán)變量
let a = setInterval(function () { //定義一個(gè)定時(shí)器
re+= str1.charAt(leg-i); //獲取字符串指定的位置的字符
i++;
if(i > leg) { //判斷循環(huán)變量大于指定字符串長度
clearInterval(a); //結(jié)束定時(shí)器
if (i == leg +1) { //判斷循環(huán)變量 剛好大于指定字符長度時(shí) 返回 倒敘字符串
resolve(re);
}else {
reject('倒敘失敗!');
}
}
},100);
});
let p2 =new Promise(function (resolve,reject) {
let str1 ='abcdefghijklmn';//定義一個(gè)字符串
let leg = str1.length;//獲取字符串的長度
let re ='';//存儲(chǔ)返回值
let i =1;//初始循環(huán)變量
let a1 = setInterval(function () {//定義一個(gè)定時(shí)器
re+= str1.charAt(leg-i);//獲取字符串指定的位置的字符
i++;
if(i > leg){//判斷循環(huán)變量大于指定字符串長度
clearInterval(a1);//結(jié)束定時(shí)器
if(i == leg+1){//判斷循環(huán)變量 剛好大于指定字符長度時(shí) 返回 倒敘字符串
resolve(re);
}else {
reject('倒敘失敗2!');
}
}
},100);
});
Promise.all([p1,p2]).then(function (value) {
console.log(value);/
},function(reason){
console.log(reason);
})
Promise.race([p1,p2]).then(function (value) {
console.log(value);
},function(reason){
console.log(reason);
})
Promise.resolve方法返回的是一個(gè)成功態(tài)的Promise實(shí)例
Promise.reject方法返回的是一個(gè)失敗態(tài)的Promise實(shí)例
以上就是Promise的基本用法
Provide 的用法你知道多少?
第一種用法:
Provide后面接間接賓語 時(shí),通常用with 。
Provide sb. with sth. 為某人提供所需要的東西?!?/p>
例子:
下面是美國第一夫人米歇爾 奧巴馬所寫的一個(gè)實(shí)例。
Room to Read provides girls with scholarships that cover the cost of housing , food,and books.
“閱讀空間(Room to Read)為少女們提供的獎(jiǎng)學(xué)金,涵蓋了食宿費(fèi)和書費(fèi)?!?/p>
在句子中,girls 是間接賓語,scholarship是直接賓語。
第二種用法:
Provide for
(1) 讓某人獲取自己所需要的東西?!?/p>
談及父母為家人提供東西時(shí),經(jīng)常會(huì)用到這個(gè)表達(dá)。
例子:
She says changes such as migration away from rural areas are allowing more women to find work and provide for their families.
諸如離開鄉(xiāng)村地區(qū)等一系列的改變,讓更多婦女們找到了工作,貼補(bǔ)家用。
(2)“表示未來可能發(fā)生的某事”
例子:
They say it California needs to find a way to provide for the growing need for water.
他們表示,如果水需求量不斷增加,加利福尼亞就需要尋求一中心解決方法?!?/p>
第三種用法:
Provide后面接直接賓語 時(shí),通常用to/for 。
Provide sth. to/for 將某物給予給某人”
例子:
The company provides health insurance for/to all of its employees.
該公司為所有員工繳納醫(yī)療保險(xiǎn)。
Health issurance 是直接賓語,員工是間接賓語。
PS:
Provide sth. for sb. 的用法更普遍
Provide sth. to sb. 的用法更新穎
那么我的小可愛們,你還記得上一課的知識(shí)嗎?
我們來做個(gè)題檢測(cè)一下吧!
下面橫線內(nèi)填什么呢?
Your necklace is very nice. ——,where did you buy this necklace.
A.By the way B.Mind you
為什么 suggest 后不能接 to do?
1.
首先我想解決這個(gè)問題下的爭(zhēng)議。
現(xiàn)代語言學(xué)(包括語法)有個(gè)基本前提性的結(jié)論,即語言是一種convention,即社會(huì)的約定俗成。這里有兩點(diǎn)值得注意:
這個(gè)「約定俗成」不是完全隨意的,背后有規(guī)律可循。從語言實(shí)例中歸納總結(jié)出「規(guī)律」就是語言學(xué),「規(guī)律」被總結(jié)出來之后自然就表現(xiàn)出比較強(qiáng)的規(guī)范性(prescriptive),變成了「規(guī)則」,「規(guī)則」在一段時(shí)間之內(nèi)相對(duì)比較穩(wěn)定,因此可以用以判斷語言的「對(duì)錯(cuò)」。
這個(gè)「約定俗稱」得是社會(huì)性的。不能隨便找兩個(gè)人來創(chuàng)造一個(gè)新的「規(guī)則」,因?yàn)樯鐣?huì)普遍意義上不認(rèn)同。所以大部分「新用法」都被視為是錯(cuò)誤的,都消失在歷史長河中,只有少數(shù)被社會(huì)普遍接受之后才能納入上述的「規(guī)則」范疇之內(nèi),語言就是這樣緩慢生長的。
綜合以上兩點(diǎn),自然就能看出來,「規(guī)則」相比「語言實(shí)例」總是滯后的??赡苣硞€(gè)用法很多人都在用了,但是主流規(guī)則還是不承認(rèn)。舉幾個(gè)中文的例子,比如「男主角」現(xiàn)在很多念「男主jiǎo」了,比如「氣氛」很多人都念「氣fèn」,比如「細(xì)思極恐」「十動(dòng)然拒」等詞現(xiàn)在很流行了,但是在高考語文考卷上這樣用是要失分的,在正式書面文件上這樣用也是要被讀者皺眉頭的。
現(xiàn)在來看英語。我們作為外國人學(xué)英語,當(dāng)然是想學(xué)decent English/ standard English——雖然英語沒有「普通話」考試,但是SAT、ACT仍然考語法,也有的是語法書可以參考。碰到有爭(zhēng)議的新新用法的時(shí)候,我一般建議大家適當(dāng)保守,選用穩(wěn)妥的被普遍接受的用法。至于某些native speaker選用這些新新用法,能聽懂就行,自己不要用。像我在美國,碰到不規(guī)范的英文用法、發(fā)音多了去了,我聽聽就行,自己堅(jiān)持用的還是當(dāng)年在人教版上學(xué)的正式的、標(biāo)準(zhǔn)的decent English。不要迷信native spaker,native speaker也有教育水平低的嘛,即便是高教育水平的native speaker也會(huì)犯錯(cuò)的嘛。我就教過英美澳的老外英語語法——這沒什么稀奇,一個(gè)本碩博都學(xué)中文的美國人如果來糾正咱漢語的語病,只要講的有道理,咱也會(huì)接受的對(duì)吧。
具體到suggest后能不能接to do的爭(zhēng)議。也許有不少native speaker說suggest to do,但是顯然這種用法沒有被接受為decent English/ standard English的「規(guī)則」之內(nèi)。
從詞源來看,suggest = suggerere = sub- ‘from below’ + gerere ‘bring’,即「從下提起」「提出」(以供他人考慮)的意思,那么后面自然接名詞性的成分,即:
名詞:Ruth suggested a vacation.
動(dòng)名詞:I suggested going in my car.
名詞性從句:I suggest that we wait a day or two.
值得仔細(xì)分析的是第三種情況,「that we wait a day or two」即便we換成he/she,后面還是用wait。正因?yàn)閟uggest是「提出」(以供他人考慮),所接從句的內(nèi)容應(yīng)該是將來性的(即下例的shall),同時(shí)又應(yīng)該是一種虛擬的將來性(即建議方也并不確定這種將來性是否會(huì)成真),所以要用將來時(shí)態(tài)的虛擬語氣(即下例的should)。如果這樣說難以理解,也可以簡單理解成「客氣」(類似于Could you please...中的could表示客氣)。如果還是難以理解,還可以簡單理解成「應(yīng)該」,即「我建議你應(yīng)該怎么做」。
當(dāng)然,以上分析僅針對(duì)suggest做「提出」(以供他人考慮)或者一般翻譯的「建議」的意思,suggest還可以表示「暗示」,那就不需要用虛擬語氣,用正常語氣即可:
Are you suggesting I’m lazy?
for的用法詳解,C語言for循環(huán)完全攻略
for 循環(huán)語句的一般形式為:
for (表達(dá)式1; 表達(dá)式2; 表達(dá)式3)
{
語句;
}
首先要強(qiáng)調(diào)兩點(diǎn):
1) 表達(dá)式1、表達(dá)式2和表達(dá)式3之間是用分號(hào);隔開的,千萬不要寫成逗號(hào)。
2) for(表達(dá)式1;表達(dá)式2;表達(dá)式3)的后面千萬不要加分號(hào),很多新手都會(huì)犯這種錯(cuò)誤——會(huì)情不自禁地在后面加分號(hào)。
因?yàn)?for 循環(huán)只能控制到其后的一條語句,而在C語言中分號(hào)也是一個(gè)語句——空語句。所以如果在后面加個(gè)分號(hào),那么 for 循環(huán)就只能控制到這個(gè)分號(hào),下面大括號(hào)里面的語句就不屬于 for 循環(huán)了。
下面來看看它的執(zhí)行過程:
求解表達(dá)式1。
求解表達(dá)式2。若其值為真,則執(zhí)行 for 語句中指定的內(nèi)嵌語句,然后執(zhí)行第3步;若表達(dá)式2值為假,則結(jié)束循環(huán),轉(zhuǎn)到第5步。
求解表達(dá)式3。
轉(zhuǎn)回上面第2步繼續(xù)執(zhí)行。
循環(huán)結(jié)束,執(zhí)行 for 語句下面的語句。
從這個(gè)執(zhí)行過程中可以看出,“表達(dá)式1”只執(zhí)行一次,循環(huán)是在“表達(dá)式2”“表達(dá)式3”和“內(nèi)嵌語句”之間進(jìn)行的。
for語句最簡單的形式是:
for (循環(huán)變量賦初值; 循環(huán)條件; 循環(huán)變量增值)
{
語句;
}
下面給大家寫一個(gè)程序,求 1+2+3+4+…+100 的總和。
# includeint main(void){ int i; int sum = 0; //sum的英文意思是“總和” for (i=1; i<=100; ++i) //++是自加的意思, ++i相當(dāng)于i = i + 1 { sum = sum + i; /.價(jià)于sum += i;但是不建議這么寫, 因?yàn)閟um = sum + i看起來更清楚、更舒服. } printf("sum = %dn", sum); return 0;}
輸出結(jié)果是:
sum = 5050
這個(gè)程序的功能是實(shí)現(xiàn)求 1+2+3+4+…+100 的和,如果不用循環(huán),加一次就要一條語句,加 100 次就要 100 條語句。這里是從 1 加到 100,要是從 1 加到 10000 那就要 10000 條語句。但有了循環(huán)就很方便了,你想加到多少就加到多少,只要改一個(gè)參數(shù)就可以了。所以循環(huán)很重要。
下面按照?qǐng)?zhí)行過程看看上面這個(gè)程序是怎樣執(zhí)行的。
1) 首先定義一個(gè)循環(huán)變量 i。定義的時(shí)候可以不給它賦初值,在 for 循環(huán)里面再給它賦初值也行。但前面說過,最好在定義變量的時(shí)候就對(duì)它進(jìn)行初始化,如果值不確定就初始化為 0。所以程序中也可以在定義 i 的時(shí)候就給它賦初值,那么 for 循環(huán)里的“表達(dá)式1”就可以省略了,但分號(hào)不可以省略。
這樣的話,執(zhí)行的時(shí)候就跳過第1步,直接進(jìn)入第2步,其他的不變。所以程序也可以像下面這樣寫:
# includeint main(void){ int i = 1; int sum = 0; for (; i<=100; ++i) { sum = sum + i; } printf("sum = %dn", sum); return 0;}
當(dāng)然表達(dá)式1加上也行,大不了再重新賦一次值。
2) 然后定義一個(gè)用來存放“和”的變量 sum,并給它賦初值 0,然后進(jìn)入 for 循環(huán):
首先求解表達(dá)式1,即給變量i賦初值,i=1;表達(dá)式1只執(zhí)行這一次,下面都不會(huì)再執(zhí)行了。
然后求解表達(dá)式2,若 1<=100 成立,則執(zhí)行 for 循環(huán)中的內(nèi)嵌語句,即 sum=0+1。
然后執(zhí)行第3步,變量 i 自加 1,即變量 i 由 1 變?yōu)?2。
然后再求解表達(dá)式2,2<=100 成立,則執(zhí)行 for 循環(huán)中的內(nèi)嵌語句,sum=0+1+2。
然后再執(zhí)行第3步,變量 i 自加 1,即變量 i 由 2 變?yōu)?3。
然后再求解表達(dá)式2,即 3<=100 成立,則執(zhí)行 for 循環(huán)中的內(nèi)嵌語句,sum=0+1+2+3。
……
就這樣一直循環(huán)下去,直到 ++i 等于 100 的時(shí)候,求解表達(dá)式2,即 100<=100 成立,則執(zhí)行 for 循環(huán)中的內(nèi)嵌語句,sum=0+1+2+3+…+100。
然后再執(zhí)行第3步,變量 i 自加 1,即變量 i 由 100 變?yōu)?101。然后再求解表達(dá)式2,即 101<=100 不成立,則結(jié)束循環(huán),執(zhí)行 for 循環(huán)下面的語句即 printf。
以上就是這個(gè)程序的執(zhí)行過程。關(guān)于 for 語句的代碼規(guī)范化問題,有兩點(diǎn)要再跟大家強(qiáng)調(diào)一下:
1)if、else、for、while、do 都只能控制到其后的一條語句,如果要控制多條語句必須加大括號(hào){}。但基于代碼規(guī)范化,if、else、for、while、do 后面的執(zhí)行語句不論有多少行,就算只有一行也要加{}。
2) 像 if、for、while 等關(guān)鍵字之后應(yīng)留一個(gè)空格再跟左括號(hào)(,以突出關(guān)鍵字。
此外上面的程序還有一個(gè)知識(shí)點(diǎn)要跟大家說一下:從功能上講,for(i=1; i<=100;++i)完全可以寫成for(i=1; i<101; ++i),而且建議大家盡量使用這種寫法。也就是說,循環(huán)語句的循環(huán)條件盡量寫成半開半閉的,不管是 for 循環(huán)還是 while 循環(huán)。
for(i=1; i<101; ++i)實(shí)際上是 1≤i<101,是半開半閉的;而for(i=1; i<=100; ++i)實(shí)際上是 1≤i≤100,是全閉的。那么為什么建議使用半開半閉的呢?因?yàn)槿绻麑懗?i<=100 的話,那么每次判斷的時(shí)候都要判斷兩次,即 i<100 和 i==100,而寫成 i<101 的話每次只需要判斷一次。
也許有人說:程序在執(zhí)行 i<=100 的時(shí)候不是將它轉(zhuǎn)換成 i<100||i==100 嗎?這樣由“短路或”的知識(shí)可知,如果前面的為真那么后面的不就不會(huì)執(zhí)行了嗎?這樣不也是判斷一次嗎?不是這樣的,系統(tǒng)是不會(huì)將 i<=100 轉(zhuǎn)換成 i<100||i==100 的,每次判斷的時(shí)候 i<100 和 i==100 都要判斷。
但是寫成半開半閉也有一個(gè)問題,就是會(huì)影響對(duì)代碼的理解。有時(shí)候?qū)懗扇]的區(qū)間理解起來才順暢,而寫成半開半閉反而不易理解,比如<=右邊是變量或表達(dá)式的時(shí)候。這時(shí)候要以可讀性為第一要素,即哪種好理解就使用哪種。現(xiàn)在 CPU 速度那么快,也不在乎那點(diǎn)效率。所以前面說“盡量”,沒有要求一定要那樣寫。
下面再給大家寫一個(gè)程序,求 1 到 100 之間所有奇數(shù)的和。
# includeint main(void){ int i; int sum = 0 ; for (i=1; i<100; i+=2) //i+=2;等價(jià)于i = i + 2; { sum = sum + i; } printf("sum = %dn", sum); return 0;}
輸出結(jié)果是:
sum = 2500
關(guān)于自增和自減
一直以來,++ 和 –– 語法浪費(fèi)了太多人的時(shí)間。說句實(shí)在話,++ 和 –– 在C語言中根本就不重要,除了表達(dá)簡練外,真的沒有什么其他好處了。
簡單地說:++i 和 i++ 在單獨(dú)使用時(shí),都表示 i=i+1;––i 和 i–– 在單獨(dú)使用時(shí),都表示 i=i–1。
而 a=++i 就相當(dāng)于 i=i+1,a=i;a=i++ 就相當(dāng)于 a=i,i=i+1。
同理,a=––i 就相當(dāng)于 i=i–1,a=i;a=i–– 就相當(dāng)于 a=i,i=i–1。
如果實(shí)在搞不明白 ++ 和 –– 是怎么回事,那也不是什么天塌下來的事情。因?yàn)閍=++i;完全可以寫成i++; a=i;。而a=i++;也完全可以寫成a=i; i++;。而且,這也是一種很好的程序風(fēng)格。
作為一個(gè)優(yōu)秀的程序員,在你的程序中就不應(yīng)該體現(xiàn)出 ++i 和 i++ 的區(qū)別,要么都用 ++i,要么都用 i++,不要一會(huì)兒用 ++i 一會(huì)兒用 i++。
對(duì)于自增和自減還有一點(diǎn)需要強(qiáng)調(diào)的是:只有“變量”才能進(jìn)行自增和自減!你認(rèn)為 3++ 等于多少?C語言中沒有這種寫法,常量是不能進(jìn)行自增和自減的。
for循環(huán)練習(xí)
1) 求 1! + 2! + 3! + ... + n!
# includeint main(void){ int n = 0; int i = 0; int m = 1; int sum=0; printf("請(qǐng)輸入n的值:"); scanf("%d", &n); for (i=1; i<=n; ++i) { m = m .i; sum = sum +m; } printf ("sum = %dn", sum); return 0;}
這個(gè)程序雖然短,但邏輯性很強(qiáng),算法很好,所以建議讀者記住。因?yàn)檫壿嬓詮?qiáng),所以只看是很難明白的,自己在紙上試一下,將自己當(dāng)成計(jì)算機(jī)一步步地計(jì)算就明白了。
假如 n=4:
當(dāng) i=1 時(shí),m=1,sum=1。
當(dāng) i=2 時(shí),m=1×2,sum=1+1×2。
當(dāng) i=3 時(shí),m=1×2×3,sum=1+1×2+1×2×3。
當(dāng) i=4 時(shí),m=1×2×3×4,sum=1+1×2+1×2×3+1×2×3×4。
看出規(guī)律來了嗎?m 的值是一直往下乘,乘以 i 之前 m 的值是(i–1)的階乘,乘以 i 之后 m 的值就是 i 的階乘了。這樣 i 循環(huán)到多少,m. 就立刻將這個(gè)數(shù)的階乘計(jì)算出來,然后加到 sum 中。
2) for 和 if 的嵌套使用。求 1 到 100 之間所有能被 3 整除的數(shù)之和。
# includeint main(void){ int i; int sum = 0; for (i=3; i<100; ++i) { if (0 == i%3) { sum = sum +i; } } printf("sum = %dn", sum); return 0;}
輸出結(jié)果是:
sum = 1683
大家想想如果不用 if,這個(gè)程序能不能寫出來?當(dāng)然能,能被 3 整除的數(shù)肯定是 3 的倍數(shù),只要 i 每次自加 3 就行了。我們將這個(gè)程序?qū)懸幌拢?/p>
# includeint main(void){ int i; int sum = 0; for (i=3; i<100; i+=3) { sum = sum +i; } printf("sum = %dn", sum); return 0;}
因?yàn)?++i 每次只加 1,而 i+=3 每次加 3,所以這種寫法與第一種寫法比較起來計(jì)算機(jī)少執(zhí)行很多步,所以執(zhí)行起來更快。由此可知,完成相同的功能,算法不一樣則效果就不一樣。對(duì)計(jì)算機(jī)而言當(dāng)然是執(zhí)行得越快越好。
3) 編寫程序,輸出 1~1000 之間所有的完全平方數(shù)。
# include# include//要用sqrt()int main(void){ int i; //循環(huán)變量 int x; //存儲(chǔ)每個(gè)數(shù)的二次方根 for (i=1; i<1000; ++i) { x = sqrt(i); /.果i不是完全平方數(shù), 那么sqrt(i)肯定是小數(shù), 而i是int型, 所以x是sqrt(i)取整后的值, 這樣x.肯定不等于i. if (x. == i) { printf("%dt", i); // t是跳到下一個(gè)Tab位置 } } printf("n"); return 0;}
輸出結(jié)果是:
1 4 9 16 25 36 49 64 81 100
121 144 169 196 225 256 289 324 361 400
441 484 529 576 625 676 729 784 841 900
961
其實(shí)這個(gè)程序還有更簡單的算法,不需要使用 sqrt()。下面將這個(gè)程序也寫下來:
# includeint main(void){ int i; //循環(huán)變量 for (i=1; i.<1000; ++i) { printf("%dt", i .i); // t是跳到下一個(gè)Tab位置 } printf("n"); return 0;}
輸出結(jié)果是:
1 4 9 16 25 36 49 64 81 100
121 144 169 196 225 256 289 324 361 400
441 484 529 576 625 676 729 784 841 900
961
provide的用法和辨析
![](/skin/tiku/images/icon_star.png)
![](/skin/tiku/images/icon_star.png)
![](/skin/tiku/images/icon_star.png)
![](/skin/tiku/images/icon_star.png)
![](/skin/tiku/images/icon_star.png)
上一篇:Promise的基本用法
下一篇:suggest用法詳解