實現自己的Promise polyfill

2022-05-31 15:15:11 字數 3030 閱讀 6246

功能清單:

promise.prototype.then()

promise.prototype.catch()

promise.reject()

promise.resolve()

promise.all()

promise.race()

promise.prototype.finally()

參考:prmoises a+規範

function promise(fn) 

_this._value = val;

_this._status = "resolved";

while (callback = _this._onresolveds.shift())

} function reject(reason)

_this._reason = reason;

_this._status = "rejected";

while (callback = _this._onrejecteds.shift())

} try catch (err)

}

then (重點)
promise.prototype.then = function (onresolved, onrejected) 

onrejected = typeof onrejected === 'function'? onrejected:function(err)

var _this = this

var promise2 // then始終返回乙個promise例項,用於鏈式呼叫。

if (_this._status === "resolved") catch (e)

}, 0);

})} if (_this._status === "rejected") catch (e)

}, 0);

})} if (_this._status === "pending") catch (e)

}, 0);

});_this._onrejecteds.push(function () catch (e)

}, 0);

});})

} return promise2

};

根據onresolved/onrejected的返回值 x 的不同情況,呼叫promise2的resolve和reject
function resolvepromise (promise2, x, resolve, reject) 

var called = false // 防止多次呼叫

if (x!== null && (typeof x ==='object' ||typeof x === 'function')) , function(err) )

} else

} catch (e)

} else

}

promise.prototype.catch = function (onrejected)
promise.resolve = function (value) )

}

promise.reject = function (reason) )

}

promise.all = function (promises) 

var length = promises.length

var values =

return new promise(function (resolve, reject)

function resolvehandle(index) }}

promises.foreach(function (item, index) )

})}

promise.race = function (promises) 

return new promise(function (resolve, reject)

function resolvehandle(value)

promises.foreach(function (item) )

})}

// 不管resolved還是rejected,都會執行,避免同樣的語句需要在then()和catch()中各寫一次的情況。

promise.prototype.finally = function (callback)

使用promises-aplus-tests:全域性安裝npm i promises-aplus-tests -g,然後命令列promises-aplus-tests [js檔名]進行測試

注意:測試前要在尾部加上下面的**:

promise.deferred = promise.defer = function () ;

deferred.promise = new promise(function (resolve, reject) );

return deferred

};module.exports = promise

測試完成後可刪除

(function (global, factory)  else if (typeof exports === 'object' && typeof module !== 'undefined')  else 

})(this, function () catch (e)

global.promise = promise

} return promisepolyfill

})

promisepolyfill()  // 註冊promise全域性變數

實現自己的print

在嵌入式開發中,常常會通過串列埠列印一些資訊到pc終端,這就需要實現自己的printf函式,下面介紹列印函式print的實現。print.h ifndef print h define print h void print char fmt,void printch char ch void pri...

自己實現的TransactionManager

b 背景 b color red 目前有乙個系統,系統已經寫好了,但是要不停的新增新的功能,用struts,業務邏輯寫在action中,以後可能增加一層service。業務處理和持久層沒有使用任何框架,目前是用dao擔任業務處理加持久層雙重操作,但是有些業務處理很複雜,固設計了乙個事務處理框架,大家...

自己實現printf

原理不是很難網上有很多,自己搜一下就明白了。void printlog const char fmt,看到上面 太簡單了,也許有人會說,這有什麼用?在我看來最大的用處在於寫日誌,如果我們把 稍稍改下就可以把螢幕上的輸出一起輸出到檔案乙份 在初始化處把全域性變數日誌檔案開啟就像這樣 plogfile ...