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