2019年11月28日木曜日

[javascript / node.js] Promise初步測試

得出的一些規則:
  • 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 件のコメント:

コメントを投稿