- then(function(resolve), function(reject))。不能寫成then(function(resolve,reject))。
then可以只有一個resolve的動作,那reject會一直往後傳到有reject function或是catch的地方。 - 因為then(resolve)只能接一個參數,要在裡面改丟reject,有以下方法。
1. 使用throw。在promise中throw是安全的。而且throw可以中斷後續的程式碼的執行。只要整個chain後面有任何一個地方寫reject或是catch()即可捕捉。 在promise裡面throw,會被當成reject。當沒有任何一個地方有指定reject function的話,就會由.catch()接手。
2. return new Promise(resolve, reject)。 使用此法要注意的是,一定要加上「return」。
3. return Promise.reject(Object)。使用此法要注意的是,一定要加上「return」。 - promise function裡面resolve()跟reject()都被執行到的話,then的結果會是先call到的那個動作。而且resolve()跟reject()後續有程式碼的話,都會被執行到。而且是後續的所有程式碼執行完之後才會進行then的動作。當然可以用return resolve();來中斷後續程式碼的執行。
- catch之後可以繼續then(function(Object))。而且catch之後的then,無論前面是resolve(不會跑catch)或是reject(會跑catch(),所以後續的then()接到的是catch()回傳的物件)都會被執行到。
要是catch裡面有return object, 後續的then()就會接到。若是沒有return的話,then(function(object)) 得到的object是undefined。 - 對promise function使用await的話,就是等到整個chain最後的resolve或是reject出現算是執行完成。
以下是簡單的測試動作。
async function promiseTest()
{
console.log("before promise test");
//Promise.reject("rej1")
await Promise.resolve("res1")
.then((response) => {console.log("response1=" + response);})
.then(function(response) {
console.log("before throw")
//throw "throw1";
//return Promise.reject("rej1");
console.log("after throw")})
.then(function(response) {
return new Promise(function(resolve, reject){
console.log("before promise2");
resolve("res2");
console.log("between promise2");
reject("rej2");
console.log("after promise2");
});
})
.catch((error) => {
console.error("catch error=" + error);
return error;
})
.then(function(response) {
return new Promise(function(resolve, reject){
console.log("before promise3. response=", response);
try {
console.log("before throw promise3");
throw "throw2";
console.log("after throw promise3");
}
catch (e)
{
console.log("before catch promise3");
reject(e);
console.log("after catch promise3");
}
console.log("after promise3");
});
})
.then((response) => {console.log("response2=" + response);
return "res3";})
.then((responseText) => {
//document.querySelector("#result").innerHTML = responseText
console.log(responseText)
}, (reject1) => console.error("1st reject=" + reject1))
.catch((error) => {
console.error("catch error=" + error)
});
console.log("after promise test");
}
promiseTest();
0 件のコメント:
コメントを投稿