今天就跟大家聊聊有关JavaScript中Promise函数的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
问题需求
如何保证多个 promise 顺序执行?
实例:
var f1 = function (){ return new Promise(function (resolve, reject){ setTimeout(function (){ console.log("f1 ok!") resolve("f1 ok!"); }, 1000) }); } var f2 = function (){ return new Promise(function (resolve, reject){ setTimeout(function (){ console.log("f2 ok!") resolve("f2 ok!"); }, 3000) }); } var f3 = function (){ return new Promise(function (resolve, reject){ setTimeout(function (){ console.log("f3 ok!") resolve("f3 ok!"); }, 2000) }); }
当然如果要并行的话,我们很容易想到 Promise.all 方法:
Promise.all([f1(), f2(), f3()]).then(function (data){ console.log(data) }) // f1 ok! // f3 ok! // f2 ok! // ["f1 ok!", "f2 ok!", "f3 ok!"]
如果要顺序执行:
f1().then(f2).then(f3) // f1 ok! // f2 ok! // f3 ok! //或者这样 function f(all) { var promise = Promise.resolve(); all.forEach((p, index) => { promise = promise.then(p) }) } f([f1, f2, f3])
那么问题来了,then是如何做到顺序执行的呢,参数既可以是一个普通函数,也可是是一个返回promise的函数?
then的奥秘
很多实现promise的库都比较复杂,如果自己实现的话,可以借鉴下面简单的代码:
Promise.prototype.then = function(onFulfilled, onRejected) { var promise = this; return new Promise(function(resolve, reject) { function handle(value) { var ret = typeof onFulfilled === 'function' && onFulfilled(value) || value; if (ret && typeof ret['then'] == 'function') { ret.then(function(value) { resolve(value); }, function(reason) { reject(reason); }); } else { resolve(ret); } } function errback(reason) { reason = typeof onRejected === 'function' && onRejected(reason) || reason; reject(reason); } if (promise._status === 'PENDING') { promise._resolves.push(handle); promise._rejects.push(errback); } else if (promise._status === FULFILLED) { callback(promise._value); } else if (promise._status === REJECTED) { errback(promise._reason); } }); }
看完上述内容,你们对JavaScript中Promise函数的作用是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。