把ajax包裝成promise的形式 3

2022-03-04 10:07:18 字數 2269 閱讀 9664

為了體驗promise的原理,我打算自己把ajax包裝成promise的形式。主要希望實現下列功能:

// 1.使用success和error進行鏈式呼叫,並且可以在後面加上無限個

promise.get(myurl).success(successcallback1).error(errorcallback1).success(successcallback2).error(errorcallback2).error(errorcallback3).success(successcallback3);

// 2.支援同時呼叫多個myurl,這個時候需要最後的http請求返回之後才執行**。

promise.get(myurl1).success(successcallback1).get(myurl2).error(errorcallback1).get(myurl3).error(errorcallback2).success(successcallback1);

// 3.支援post和jsonp請求。

對於ajax我選用jq的ajax,但是盡量不使用jq的deferred物件。

本篇博文實現功能2:多非同步情形。

在多非同步情形下,成功**和失敗**的處理方式有如下情況:

成功**接收所有引數,失敗**接收單一引數,只要失敗,成功**不執行,只執行相應失敗**。

成功**接收所有引數,失敗**接收單一引數,就算失敗,也執行成功**。

成功**接收所有引數,失敗**接收所有引數,就算失敗,也執行成功**。

等等。上面的情況都可以實現,但是只有情況1比較符合實際業務,所以我們只實現情況1.

實現的方法是:我們引入乙個哨兵變數,並且把返回的資料按順序儲存起來,用哨兵變數判斷出最後乙個成功返回後,表示資料全部返回,然後執行**函式。

**如下:

// 模擬ajax

let mockajax = () => else

});}let promise = function() ;

// 返回資料的結果集合

this.result = ;

// 哨兵變數

this.sum = 0;

this.count = 0;

};promise.prototype.success = function(cb) ;

promise.prototype.error = function(cb) ;

promise.prototype.get = function(url)

}// 初始化

that.result.length = 0;

that.sum = 0;

that.count = 0;}}

},error: function (err, status) }}

});});

return this;

}// test***************====

let successcallback = (message) => (result, status) => );

}let errorcallback = (message) => (err, status) =>

let testpromise = new promise();

testpromise.get('url1').success(successcallback(1)).success(successcallback(2)).error(errorcallback(1)).error(errorcallback(2)).get('url2').success(successcallback(3)).error(errorcallback(3)).get('url3');

測試輸出結果如下:

// 成功情況

url1get成功**1

url2get成功**1

url3get成功**1

url1get成功**2

url2get成功**2

url3get成功**2

url1get成功**3

url2get成功**3

url3get成功**3

// 失敗情況

url1get失敗**1

url1get失敗**2

url1get失敗**3

可以看到,成功情況,對返回的三個資料依次執行成功123;失敗情況,只對失敗的url1執行了失敗**123。

把SWT包裝成Plugin需要修改的地方

把乙個swt程式包裝到eclipse裡作為plugin執行很容易,但有以下幾點需要注意 1 eclipse的 pde tools convert projects to plug in projects 可生成plugin工程需要的檔案,注意原來在classpath裡對swt.jar的引用應改為ma...

手寫promise封裝ajax

其實,axios本身就是基於promise進行封裝的,我們之所以進行二次封裝,主要是為了能夠對錯誤資訊進行乙個集中的處理,根據不同的錯誤資訊,需要給使用者不同的提示,以便於給使用者乙個良好的操作體驗。封裝方法有很多種,基於class類的,基於建構函式的,也可以直接封裝乙個函式。具體按照個人習慣,最主...

promise配合ajax使用

目錄 原生ajax和promise的結合使用 ecmascript 6 原生提供了 promise 物件。promise 物件代表了未來將要發生的事件,用來傳遞非同步操作的訊息。物件的狀態不受外界影響。promise 物件代表乙個非同步操作,有三種狀態 promise物件是微任務!1.建立xmlht...