請(qǐng)問下面的樣例代碼中,resolve, reject這倆函數(shù)的定義在哪?
new Promise(function (resolve, reject) {
log('start new Promise...');
var timeOut = Math.random() * 2;
log('set timeout to: ' + timeOut + ' seconds.');
setTimeout(function () {
if (timeOut < 1) {
log('call resolve()...');
resolve('200 OK');
}
else {
log('call reject()...');
reject('timeout in ' + timeOut + ' seconds.');
}
}, timeOut * 1000);
}).then(function (r) {
log('Done: ' + r);
}).catch(function (reason) {
log('Failed: ' + reason);
});Promise 在 javascript 中是一個(gè)構(gòu)造函數(shù)通過 new 來實(shí)例化一個(gè)對(duì)象
你可以將 new Promise() 操作想象成一個(gè)可以做異步處理的一個(gè)東西, 它接受一個(gè)函數(shù)作為參數(shù), 你可以把你想異步做的事情放在這個(gè)函數(shù)內(nèi)部
這個(gè)函數(shù)又接收兩個(gè)參數(shù)resolve, reject, 比如你貼的代碼:
new Promise(function (resolve, reject) {
// log('start new Promise...'); 打印先不看
// 獲取隨機(jī)數(shù)
var timeOut = Math.random() * 2;
// log('set timeout to: ' + timeOut + ' seconds.'); 還是打印
// 這里是你想異步做的事情
setTimeout(function () {
// timeOut < 1 貌似是你想要的結(jié)果, 如果符合了這個(gè)情況, 那么就要告訴Promise, "好的我要異步做的事情已經(jīng)做好了, 把做好的結(jié)果通過resolve給我吧"
// 反之不小于 1 了, 可能就是你不太想看到的結(jié)果了,你不想讓 promise 繼續(xù)去做你的異步的事情了, 那就讓 reject 告訴你這個(gè)不好的結(jié)果, 然后 事情也不用你做了,你可以暫停了
if (timeOut < 1) {
log('call resolve()...');
resolve('200 OK');
} else {
log('call reject()...');
reject('timeout in ' + timeOut + ' seconds.');
}
}, timeOut * 1000);
// 如果上面 Promise 在處理你的事情的時(shí)候發(fā)現(xiàn) timeOut < 1了, 那么它就會(huì)馬上停下來告訴你異步事情已經(jīng)做完啦, 我要終止了,我的狀態(tài)也要變成已完成了
// 這個(gè)時(shí)候你就可以通過then 來接收 "resolve('200 OK');"返給你的這個(gè)200的狀態(tài)了
}).then(function (r) {
// 這里你再去打印 r 肯定就是 200 ok 的狀態(tài)了
log('Done: ' + r);
// 反之, 如果Promise 在處理你的事情的時(shí)候發(fā)現(xiàn) timeOut 不小于1了, 那么它也會(huì)馬上停下來告訴你說: 我遇到了你不想看到的結(jié)果了, 我不能再繼續(xù)處理事情了, 我的狀態(tài)也要改變?yōu)槭×?我會(huì)通過 reject把 失敗的情況告訴你
}).catch(function (reason) {
// 這里你就可以 catch 到 reject返給你的錯(cuò)誤信息了
log('Failed: ' + reason);
});
以上是我自己編的, 哪里不對(duì)大佬們請(qǐng)指出, 誤了別人我就有罪了, 希望能幫助到你, 后端童鞋
Promise相當(dāng)于一個(gè)承諾,resolve和reject是Promise自帶的,是讓Promise從中立的狀態(tài)轉(zhuǎn)換成失敗和成功的,當(dāng)發(fā)出承諾時(shí)只是一個(gè)中立的狀態(tài),承諾是有失敗和成功的,resolve代表成功,調(diào)用resolve時(shí)就代表這個(gè)承諾成功了,調(diào)用reject時(shí)就代表這個(gè)承諾失敗了。原來如此,是要調(diào)用resolve和reject來觸發(fā)狀態(tài)呀,然后通過這個(gè)狀態(tài)的改變來執(zhí)行Promise實(shí)例上的then、catch方法,new Promise().then(成功調(diào)用,失敗調(diào)用),new Promise().then(成功調(diào)用).catch(失敗捕獲)。
比如一個(gè)簡(jiǎn)單的ajax
function ajax(mode,url,data){
return new Promise(function(resolve,reject){
var request = new XMLHttpRequest();
request.open(mode,url,true);
request.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
request.send(postDataFormat(data));
request.onload = function(){
if((this.status >= 200 && this.status < 300) || this.status == 304){
resolve(this);
}else{
reject(this);
};
};
})
}
function postDataFormat(obj){
if(typeof obj != "object" ) {
alert("輸入的參數(shù)必須是對(duì)象");
return;
}
var arr = new Array();
var i = 0;
for(var attr in obj) {
arr[i] = encodeURIComponent(attr) + "=" + encodeURIComponent(obj[attr]);
i++;
}
return arr.join("&");
}
//第一次請(qǐng)求成功后請(qǐng)求第二個(gè)。
ajax('POST','./1.php',{aaa:"aaa",bbb:"bbb"}).then((res)=>{
console.log(res.response);
return ajax('POST','./1.php',{aaa:"aaa1",bbb:"bbb1"});
}).then((res)=>{
console.log(res.response);
}).catch((res)=>{
console.log(res.statusText);
})
//當(dāng)然你也可以用Promise并行,幾個(gè)異步事件一起執(zhí)行,一起拿到結(jié)果
Promise.all([ajax('POST','./1.php',{aaa:"aaa",bbb:"bbb"}),ajax('POST','./1.php',{aaa:"aaa1",bbb:"bbb1"})]).then(function(val){
console.log(val);
});
有興趣可以看看我的博客鏈接描述
首先你得知道,javascript函數(shù)中的參數(shù)可以是一個(gè)函數(shù),比如:
function a(arg){
console.log(arg)
}
function b(fn){
fn('a');
}
b(a); //打印 a
另外,javascript中的函數(shù)不一定是定義的,可能是生成的,比如:
function getfn(arg){
return function(){
console.log(arg);
}
}
var geta = getfn('a');
geta(); //打印 a
再來看你的問題
new Promise(function(resolve,reject){
//....
})
這樣理解 Promise 的構(gòu)造函數(shù)需要傳一個(gè)參數(shù)fn,這個(gè)參數(shù)類型必須是'function'
構(gòu)造函數(shù)會(huì)執(zhí)行這個(gè)fn,并傳兩個(gè)參數(shù)給fn(a,b),這兩個(gè)參數(shù)的類型也是'function'
用代碼理解大概是這個(gè)樣子:
class Promise{
constructor(fn){
this.init()
var resolve = this.get_resolve(); //function
var reject = this.get_reject(); //function
fn(resolve,reject);
}
...
}
最后回答你的問題:resolve,reject 是在 Promise 實(shí)例化時(shí)在構(gòu)造函數(shù)中生成的。
。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問,美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。