鍍金池/ 問答/HTML/ 寫后端的來看Promise,暈菜了

寫后端的來看Promise,暈菜了

請問下面的樣例代碼中,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);
});
回答
編輯回答
怣人

Promisejavascript 中是一個構(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);
});

以上是我自己編的, 哪里不對大佬們請指出, 誤了別人我就有罪了, 希望能幫助到你, 后端童鞋

2017年12月27日 01:08
編輯回答
旖襯

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);
    });

有興趣可以看看我的博客鏈接描述

2017年12月14日 00:07
編輯回答
朕略萌

resolve, reject是promise傳給你的,你只要調(diào)用就行了。

2018年2月20日 22:49
編輯回答
獨特范

推薦阮一峰的ES入門

2017年7月8日 19:01
編輯回答
萌二代

首先你得知道,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ù)中生成的。

2018年6月27日 23:14