1. 程式人生 > 其它 >怎麼理解new Promise(function (resolve, reject){})中函式的引數resolve和reject

怎麼理解new Promise(function (resolve, reject){})中函式的引數resolve和reject

先總結:引數resolve和reject的作用是將Promise中函式要傳遞的值,作為引數傳給後面的then和catch中函式。

resolve(值1)把值1傳給promise,然後再由promise把值1傳給then(function(值1));reject(值2)把值2給promise,然後再由promise把值2傳給catch(function(值2))。

理解的過程:

開始學習廖雪峰的Promise文章時,看到:

function test(resolve, reject) {
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);
}
以為引數resolve, reject是使用者設的倆函式,執行結果與Promise非同步過程無關。

但看到後面:

// 0.5秒後返回input*input的計算結果:
function multiply(input) {
return new Promise(function (resolve, reject) {
log('calculating ' + input + ' x ' + input + '...');
setTimeout(resolve, 500, input * input);
});
}

// 0.5秒後返回input+input的計算結果:
function add(input) {
return new Promise(function (resolve, reject) {
log('calculating ' + input + ' + ' + input + '...');
setTimeout(resolve, 500, input + input);
});
}

var p = new Promise(function (resolve, reject) {
log('start new Promise...');
resolve(123);
});

p.then(multiply)
.then(add)
.then(multiply)
.then(add)
.then(function (result) {
log('Got value: ' + result);
});
就發現不對,因為列印的123*123不是 multiply函式內的,只能來自函式唯一的引數,誰輸入了這個引數呢,只能是promise。

 

回頭仔細研究發現,resolve和reject可以改名,但需要保證名稱一致,如將resolve都改為s:

var p1 = new Promise(function (s, reject) {

s('200 OK');

reject('timeout in ' + timeOut + ' seconds.');

})
log('p1 over: ');
var p2 = p1.then(function (r) {
log('Done: ' + r);
},function (r) {
log('Done: ' + r);
});
log('p2 over: ');
Log:

p1 over:

p2 over:

Done: 200 OK

而且先執行了resolve,then就生效,後執行的reject好像就沒有效果了。

如果先執行reject後執行resolve,那麼then不會生效。

var p1 = new Promise(function (s, reject) {
reject('timeout in ' + 2+ ' seconds.');
s('200 OK');

})
log('p1 over: ');
var p2 = p1.then(function (r) {
log('Done: ' + r);
},function (r) {
log('Done: ' + r);
});
log('p2 over: ');
Log:

p1 over:

p2 over:

Done: timeout in 2 seconds.

 

 

 

 

特別注意,如果函式內部沒有執行resolve和reject,那麼這個promise分支就不會繼續執行。

 

var p1 = new Promise(function (s, reject) {
log('timeout in ' + 2+ ' seconds.');
log('200 OK');

})
log('p1 over: ');
var p2 = p1.then(function (r) {
log('Done: ' + r);
},function (r) {
log('Done: ' + r);
});
log('p2 over: ');
結果:

Log:

timeout in 2 seconds.

200 OK

p1 over:

p2 over:

 

 

 

注:本文使用第二種風格的catch:

 

1、第一種錯誤處理

new Promise((resolve) => {
setTimeout(() => {
throw new Error('bye');
}, 2000)
}).then((value) => {
console.log(value);
}).catch(error => {
console.log('Error', error);
})
2、第二種錯誤處理

// 第二種錯誤處理
new Promise((resolve, reject) => {
setTimeout(() => {
reject('bye');
}, 2000)
})
.then((val) => {
console.log(val)
}, (err) => {
console.log('Error:' + err);
})
廖雪峰:
https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544

簡書:

https://www.jianshu.com/p/3190ad5965d7
————————————————
版權宣告:本文為CSDN博主「梓沂」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/qq_27361945/article/details/102964414