摘要:可以捕獲返回值返回一個(gè),處理狀態(tài)變?yōu)榈那闆r參數(shù)是一個(gè)函數(shù),有一個(gè)參數(shù),用來(lái)記錄變成狀態(tài)返回的原因。示例用于將現(xiàn)有對(duì)象轉(zhuǎn)為對(duì)象等價(jià)于返回值返回一個(gè)對(duì)象,這個(gè)對(duì)象是被給定的值解析過(guò)的。
參考
https://pouchdb.com/2015/05/1...
https://developer.mozilla.org...
http://es6.ruanyifeng.com/#do...
是一種編寫異步代碼的方法。Promise 對(duì)象
用于表示一個(gè)異步操作的最終狀態(tài)(完成或失?。?,以及該異步操作的結(jié)果值。Promise 使用
Promise適用于這樣的場(chǎng)景,后面的操作必須根據(jù)前面的操作的結(jié)果做出相應(yīng)的反應(yīng)。 那么后面的操作必須等前面的操作完成并且獲得前面操作的結(jié)果。 假設(shè)我們現(xiàn)在有三個(gè)操作doSomethingFirst,doSomethingSecond 和finalHandler。 doSomethingSecond 需要根據(jù) doSomethingFirst 的結(jié)果做出反應(yīng) finalHandler 需要根據(jù) doSomethingSecond 的結(jié)果做出反應(yīng) 流程如下: //resOfDoSomethingFirst 是 DoSomethingFirst的結(jié)果 doSomethingFirst |-----------------| doSomethingSecond(resOfDoSomethingFirst) |------------------| finalHandler(doSomethingSecond的結(jié)果) |------------------| 實(shí)現(xiàn)這個(gè)場(chǎng)景需要解決以下兩個(gè)問(wèn)題: 后面的操作 如何知道 前面的操作 完成了 后面的操作 如何知道 前面的操作 的執(zhí)行結(jié)果是什么 //包裝第一個(gè)操作在 doSomethingFirst 中 const doSomethingFirst = new Promise(function(resolve, reject) { // ... some code if (/*操作成功 */){ resolve(doSomethingFirstValue); //將doSomethingFirst對(duì)象的狀態(tài)從“pending”變?yōu)椤皉esolved” } else { reject(doSomethingFirstError); } }); //包裝第二個(gè)操作在 doSdoSomethingSecond(resOfDoSomethingFirst) { // ... some code return somePromise(); //返回一個(gè)promise 對(duì)象 }); //整個(gè)操作流程如下: doSomethingFirst() .then(doSdoSomethingSecond) .then(finalHandler) .catch(function (err) { console.log(err); }) .finally(() => {···}); 通過(guò)new Promise創(chuàng)建的Promise 實(shí)例doSomethingFirst 有以下方法: Promise.all(iterable) Promise.race(iterable) Promise.reject(reason) Promise.resolve(value) Promise.prototype.catch(onRejected) Promise.prototype.then(onFulfilled, onRejected) Promise.prototype.finally(onFinally) 1. doSomethingSecond 如何知道 doSomethingFirst 操作完成了 通過(guò)doSomethingFirst狀態(tài)的變更通知。 一個(gè) Promise有以下幾種狀態(tài): pending: 操作未完成。 fulfilled: 操作完成,并且成功。 rejected: 操作完成,但是失敗。 resolve()函數(shù): 在異步操作成功時(shí)調(diào)用 作用是:將Promise對(duì)象的狀態(tài)從 pending 變?yōu)?fulfilled,并將異步操作的結(jié)果,作為參數(shù)傳遞出去; reject()函數(shù): 在異步操作失敗時(shí)調(diào)用 作用是:將Promise對(duì)象的狀態(tài)從 pending 變?yōu)?rejected, 并將異步操作的錯(cuò)誤,作為參數(shù)傳遞出去。 當(dāng)操作完成時(shí)(Promise對(duì)象的狀態(tài)變?yōu)閒ulfilled 或 rejected時(shí)),doSomethingFirst 就會(huì)通過(guò)then()函數(shù)調(diào)用doSomethingSecond,doSomethingSecond就知道doSomethingFirst已經(jīng)完成了。 2. doSomethingSecond 如何知道 doSomethingFirst 的執(zhí)行結(jié)果是什么 doSomethingFirst通過(guò)給then()函數(shù)調(diào)用doSomethingSecond(resOfDoSomethingFirst)并把執(zhí)行結(jié)果resOfDoSomethingFirst作為參數(shù)傳遞給doSomethingSecondPromise.prototype.then(onFulfilled, onRejected)
用于為 Promise 實(shí)例添加狀態(tài)改變時(shí)的回調(diào)函數(shù) 返回值:一個(gè)新的 Promise,所可以采用鏈?zhǔn)綄懛ǎ瑃hen()函數(shù)后面再調(diào)用then()函數(shù) 參數(shù): onFulfilled 是一個(gè)函數(shù),有一個(gè)參數(shù),用來(lái)記錄變成fulfilled狀態(tài)返回的結(jié)果 當(dāng)doSomethingFirst這個(gè)Promise的狀態(tài)變成fulfilled 時(shí),onFulfilled作為回調(diào)函數(shù)被調(diào)用 onRejected 是一個(gè)函數(shù),有一個(gè)參數(shù),用來(lái)記錄變成rejected狀態(tài)返回的原因 當(dāng)doSomethingFirst這個(gè)Promise的狀態(tài)變成rejected 時(shí),onRejected作為回調(diào)函數(shù)被調(diào)用 在當(dāng)前的例子里參數(shù)onFulfilled就是doSomethingSecond(resOfDoSomethingFirst),resOfDoSomethingFirst 記錄了doSomethingFirst 變成fulfilled狀態(tài)返回的結(jié)果。 注意事項(xiàng): 當(dāng)給then()傳入的參數(shù)不是函數(shù)時(shí),它實(shí)際上將其解釋為then(null),將使先前的Promise的結(jié)果落空 Promise.resolve("foo").then(Promise.resolve("bar")).then(function (result) { console.log(result); // foo }); 等價(jià)于 Promise.resolve("foo").then(null).then(function (result) { console.log(result);// foo }); 上面的代碼并沒(méi)有按照我們期望的打印"bar", 而是打印"foo" 正確的寫法是: Promise.resolve("foo").then(function () { return Promise.resolve("bar"); }).then(function (result) { console.log(result); // bar }); 給then()傳入的參數(shù)是函數(shù)時(shí),函數(shù)的內(nèi)部我們可以做以下三件事: 1. 返回另外一個(gè)promise 2. 返回一個(gè)同步值 3. 拋出一個(gè)同步錯(cuò)誤 示例:返回另外一個(gè)promise doSomethingFirst() .then(doSdoSomethingSecond) .then(finalHandler) //somePromise() 返回promise對(duì)象 function doSomethingSecond(resOfDoSomethingFirst) { return somePromise(); //有return, finalHandler接受到的是resOfDoSomethingSecond //somePromise();// 沒(méi)有return, finalHandler接受到的是undefined } function finalHandler(resOfDoSomethingSecond) { // handle resOfDoSomethingSecond } 示例:返回同步值 && 拋出一個(gè)同步錯(cuò)誤 返回同步值實(shí)際上是將同步代碼轉(zhuǎn)換為Promisey代碼的一種很棒的方法。例如,假設(shè)我們有一個(gè)用戶的內(nèi)存緩存。我們可以做到: //getUserByName 和 getUserAccountById 都返回promise對(duì)象 getUserByName("nolan").then(function (user) { if (user.isLoggedOut()) { //如果用戶注銷 throw new Error("user logged out!"); // 拋出一個(gè)同步錯(cuò)誤 } if (inMemoryCache[user.id]) { return inMemoryCache[user.id]; // 返回一個(gè)同步值! } return getUserAccountById(user.id); // 返回一個(gè)promise! }).then(function (userAccount) { // I got a user account! }).catch(function (err) { // Boo, I got an error! }); 如果用戶注銷,catch()將收到一個(gè)同步錯(cuò)誤;通過(guò)callbacks,這個(gè)錯(cuò)誤會(huì)被忽略 如果任何promise被拒絕,catch()將收到一個(gè)異步錯(cuò)誤。 通常情況下,一個(gè)promise 依賴于另一個(gè)promise ,但當(dāng)我們需要兩個(gè)promises的輸出。我們?cè)撛趺醋? getUserByName("nolan").then(function (user) { return getUserAccountById(user.id); }).then(function (userAccount) { // 在這里我們已經(jīng)獲取到了用戶賬號(hào)userAccount, // 但是我們也需要user對(duì)象時(shí)該怎么做? }); 解決方案: function onGetUserAndUserAccount(user, userAccount) { return doSomething(user, userAccount); } function onGetUser(user) { return getUserAccountById(user.id).then(function (userAccount) { return onGetUserAndUserAccount(user, userAccount); }); } getUserByName("nolan") .then(onGetUser) .then(function () { // at this point, doSomething() is done, and we are back to indentation 0 });Promise.prototype.catch(onRejected)
用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。catch 可以捕獲 返回值:返回一個(gè)Promise,處理狀態(tài)變?yōu)閞ejected的情況 參數(shù): onRejected 是一個(gè)函數(shù),有一個(gè)參數(shù),用來(lái)記錄變成rejected狀態(tài)返回的原因。 當(dāng)promise 狀態(tài)變?yōu)閞ejected時(shí)被調(diào)用。 注意事項(xiàng): catch(rejectHandler) 等同于 .then(null, rejectHandler)或.then(undefined, rejectHandler) 但是 then(resolveHandler).catch(rejectHandler) 和then(resolveHandler, rejectHandler) 不是完全相同的。 區(qū)別在于:當(dāng)使用then(resolveHandler, rejectHandler)格式時(shí),如果resolveHandler本身拋出了錯(cuò)誤,那么rejecthandler實(shí)際上不會(huì)捕獲錯(cuò)誤。所以更建議使用catch 而不是then的第二個(gè)參數(shù)。 示例: var p1 = new Promise((resolve, reject) => { resolve("one"); }); // catch函數(shù)中可以捕捉到resolveHandler 中的error并打印 p1.then(function () { throw new Error("oh noes"); }).catch(function (err) { console.log("err=", err); // Error: oh noes }); // reject函數(shù)不能捕捉到resolveHandler中的error p1.then(function () { throw new Error("oh noes"); }, function (err) { console.log("err=", err); });Promise.prototype.finally(onFinally)
用于指定不管 Promise 對(duì)象最后狀態(tài)如何,都會(huì)執(zhí)行的操作 finally本質(zhì)上是then方法的特例 promise .finally(() => { // 語(yǔ)句 }); // 等同于 promise .then( result => { // 語(yǔ)句 return result; }, error => { // 語(yǔ)句 throw error; } ); 返回值:返回一個(gè)Promise,這個(gè)Promise對(duì)象設(shè)置了 finally 回調(diào)函數(shù) 參數(shù):Promise 結(jié)束后調(diào)用的函數(shù),onFinally 這個(gè)函數(shù)不接收任何參數(shù),它僅用于無(wú)論最終結(jié)果如何都要執(zhí)行的情況。所以finally方法里面的操作,不應(yīng)依賴于 Promise 的執(zhí)行結(jié)果。 示例: promise .then(result => {···}) .catch(error => {···}) .finally(() => {···});Promise.resolve(value)
用于將現(xiàn)有對(duì)象轉(zhuǎn)為 Promise 對(duì)象 new Promise(function (resolve, reject) { resolve(someSynchronousValue); }).then(/* ... */); 等價(jià)于 Promise.resolve(someSynchronousValue).then(/* ... */); 返回值:返回一個(gè)Promise 對(duì)象,這個(gè)Promise對(duì)象是被給定的值解析過(guò)的。 參數(shù): value 將被Promise對(duì)象解析的參數(shù) 參數(shù)類型: Promise對(duì)象 具有then方法的對(duì)象 沒(méi)有then方法的對(duì)象 不帶有任何參數(shù) 示例1:參數(shù)是一個(gè)Promise對(duì)象 Promise.resolve將不做任何修改、原封不動(dòng)地返回這個(gè)Promise對(duì)象 var p = Promise.resolve([1,2,3]); console.log("p=", p); //"p=" [object Promise] console.log("p type= ", typeof(p)); // "p type= " "object" p.then(function(v) { console.log("v=",v); //"v=" Array [1, 2, 3] console.log("v type=",typeof(v)); //"v type=" "object" }); var p2 = Promise.resolve(p); console.log("p2=", p2); //"p2=" [object Promise] console.log("p2 type= ", typeof(p2)); //"p2 type= " "object" p2.then(function(v) { console.log("p2 v=",v); //"p2 v=" Array [1, 2, 3] console.log("p2 v type=",typeof(v)); //"p2 v type=" "object" }); p2 == p 示例2:參數(shù)是一個(gè)具有then方法的對(duì)象 返回的promise會(huì)采用這個(gè)thenable的對(duì)象的最終狀態(tài)。 let thenable = { then: function(resolve, reject) { resolve(42); } }; let p = Promise.resolve(thenable); p.then(function(value) { console.log(value); // 42 }); Promise.resolve方法會(huì)將thenable對(duì)象轉(zhuǎn)為 Promise 對(duì)象,然后就立即執(zhí)行thenable對(duì)象的then方法,thenable對(duì)象的then方法執(zhí)行后,對(duì)象p的狀態(tài)就變?yōu)閞esolved,從而立即執(zhí)行最后那個(gè)then方法指定的回調(diào)函數(shù),輸出 42 示例3:參數(shù)是一個(gè)沒(méi)有then方法的對(duì)象 var p = Promise.resolve([1,2,3]); console.log("p=", p); //"p=" [object Promise] console.log("p type= ", typeof(p)); // "p type= " "object" p.then(function(v) { console.log("v=",v); //"v=" Array [1, 2, 3] console.log("v type=",typeof(v)); //"v type=" "object" }); var p = Promise.resolve(123); console.log("p=", p); //"p=" [object Promise] console.log("p type= ", typeof(p)); // "p type= " "object" p.then(function(v) { console.log("v=",v); //"v=" 123 console.log("v type=",typeof(v)); //"v type=" "number" }); var p = Promise.resolve("123"); console.log("p=", p); //"p=" [object Promise] console.log("p type= ", typeof(p)); // "p type= " "object" p.then(function(v) { console.log("v=",v); //"v=" "123" console.log("v type=",typeof(v)); //"v type=" "string" }); 示例4:不帶有任何參數(shù) var p = Promise.resolve(); console.log("p=", p); //"p=" [object Promise] console.log("p type= ", typeof(p)); // "p type= " "object" p.then(function(v) { console.log("v=",v); //"v=" undefined console.log("v type=",typeof(v)); //"v type=" "undefined" }); 注意事項(xiàng): 立即resolve()的 Promise 對(duì)象,是在本輪“事件循環(huán)”(event loop)的結(jié)束時(shí)執(zhí)行,而不是在下一輪“事件循環(huán)”的開始時(shí) //在下一輪“事件循環(huán)”開始時(shí)執(zhí)行 setTimeout(function () { console.log("three"); }, 0); //在本輪“事件循環(huán)”結(jié)束時(shí)執(zhí)行 Promise.resolve().then(function () { console.log("two"); }); //立即執(zhí)行 console.log("one"); 結(jié)果: "one" "two" "three"Promise.reject(reason)
返回值:返回一個(gè)Promise 對(duì)象,這個(gè)Promise 對(duì)象 帶有狀態(tài)是rejected的原因 參數(shù): reason 表示Promise被拒絕的原因 new Promise(function (resolve, reject) { reject(someSynchronousReson); }).then(null,function(reason){ //... }); 等價(jià)于 Promise.reject(someSynchronousReson) .then(null, function(reason) { //... }); 示例: new Promise(function (resolve, reject) { reject("reject reason"); }).then(null,function(reason){ console.log(reason);//"reject reason" }); Promise.reject("reject reason").then(null, function(reason) { console.log(reason); // "reject reason" }); Promise.reject(new Error("reject reason")).then(null, function(error) { console.log(error); // Error: reject reason }); 注意事項(xiàng):與Promise.resolve不同的是Promise.reject()方法的參數(shù),會(huì)原封不動(dòng)地作為reject的理由,變成后續(xù)方法的參數(shù)。 const thenable = { then(resolve, reject) { reject("出錯(cuò)了"); } }; Promise.reject(thenable) .catch(e => { //e不是reject拋出的“出錯(cuò)了”這個(gè)字符串,而是thenable對(duì)象。 console.log(e === thenable) // true })Promise.all(iterable)
用于將多個(gè) Promise 實(shí)例,包裝成一個(gè)新的 Promise 實(shí)例 返回值:返回一個(gè)新的promise對(duì)象,iterable中所有的promise都變成resolved狀態(tài)時(shí)返回的 promise才會(huì)變?yōu)閞esolved狀態(tài); iterable中有一個(gè)promise變成rejected狀態(tài),promise就會(huì)變?yōu)閞ejected狀態(tài)。 參數(shù): iterable 一個(gè)可迭代對(duì)象,eg Array 或 String 示例: iterable中所有的promise都變成resolved狀態(tài)時(shí)返回的 promise才會(huì)變?yōu)閞esolved狀態(tài) var p1 = new Promise((resolve, reject) => { setTimeout(resolve, 1000, "one"); }); var p2 = new Promise((resolve, reject) => { setTimeout(resolve, 2000, "two"); }); var p3 = new Promise((resolve, reject) => { setTimeout(resolve, 3000, "three"); }); const p = Promise.all([p1, p2, p3]).then(values => { console.log(values); //["one", "two", "three"] }).catch(reason => { console.log(reason); //沒(méi)執(zhí)行 }); 流程:p創(chuàng)建時(shí)為pending狀態(tài),當(dāng)p1, p2, p3的狀態(tài)都變成resolved時(shí)觸發(fā)p變成resolved狀態(tài)。 p1 1s |----------|resolved p2 2s |--------------------|resolved p3 3s |------------------------------|resolved p resolved 示例:iterable中有一個(gè)promise變成rejected狀態(tài),promise就會(huì)變?yōu)閞ejected狀態(tài) var p1 = new Promise((resolve, reject) => { setTimeout(resolve, 1000, "one"); }); var p2 = new Promise((resolve, reject) => { setTimeout(resolve, 2000, "two"); }); var p3 = new Promise((resolve, reject) => { reject("reject"); }); const p = Promise.all([p1, p2, p3]).then(values => { console.log(values); //沒(méi)執(zhí)行 }).catch(reason => { console.log(reason); //"reject" }); 流程:p創(chuàng)建時(shí)為pending狀態(tài),p3先執(zhí)行完,p3的狀態(tài)變成rejected時(shí)觸發(fā)p變成rejected狀態(tài)。 p1 1s |----------|resolved p2 2s |--------------------|resolved p3 |-|rejected p rejected 示例:如果作為參數(shù)的 Promise 實(shí)例,自己定義了catch方法,那么它一旦被rejected,并不會(huì)觸發(fā)Promise.all()的catch方法 var p1 = new Promise((resolve, reject) => { setTimeout(resolve, 1000, "one"); }); var p2 = new Promise((resolve, reject) => { setTimeout(resolve, 2000, "two"); }); var p3 = new Promise((resolve, reject) => { reject("reject"); }).catch(reason => { console.log(reason); //reject }); const p = Promise.all([p1, p2, p3]).then(values => { console.log(values); // ["one", "two", undefined] }).catch(reason => { console.log(reason); //沒(méi)執(zhí)行 }); 流程:p創(chuàng)建時(shí)為pending狀態(tài),p3先執(zhí)行完,p3的狀態(tài)變成rejected時(shí),調(diào)用自己定義的catch函數(shù)拋出錯(cuò)誤,不會(huì)觸發(fā)p變成rejected狀態(tài)。當(dāng)p1 和 p2 也執(zhí)行完時(shí),觸發(fā)p變成resolved狀態(tài) p1 1s |----------|resolved p2 2s |--------------------|resolved p3 |-|rejected |p resolved 示例:如果傳入的參數(shù)是一個(gè)空的可迭代對(duì)象,則返回一個(gè)resolved狀態(tài)的 Promise const p = Promise.all([]).then(values => { //p創(chuàng)建時(shí)狀態(tài)就為resolved console.log(values); // [] });Promise.race(iterable)
同樣是將多個(gè) Promise 實(shí)例,包裝成一個(gè)新的 Promise 實(shí)例 返回值:返回一個(gè)新的promise對(duì)象,一旦iterable中的某個(gè)promise變?yōu)閞esolved或rejected狀態(tài),返回的 promise就會(huì)變?yōu)閞esolved或rejected狀態(tài)。誰(shuí)最先執(zhí)行完就返回誰(shuí)的狀態(tài) 參數(shù): iterable 一個(gè)可迭代對(duì)象,eg Array 或 String 示例: 一旦iterable中的某個(gè)promise變?yōu)閞esolved狀態(tài),返回的 promise就會(huì)變?yōu)閞esolved狀態(tài)。 var p1 = new Promise((resolve, reject) => { setTimeout(resolve, 1000, "one"); }); var p2 = new Promise((resolve, reject) => { setTimeout(resolve, 2000, "two"); }); var p3 = new Promise((resolve, reject) => { setTimeout(resolve, 3000, "three"); }); const p = Promise.race([p1, p2, p3]).then(values => { console.log(values); //["one", "two", "three"] }).catch(reason => { console.log(reason); //沒(méi)執(zhí)行 }); 流程:p創(chuàng)建時(shí)為pending狀態(tài),p1先執(zhí)行完,p1的狀態(tài)都變成resolved時(shí)觸發(fā)p變成resolved狀態(tài)。 p1 1s |----------|resolved p resolved p2 2s |--------------------|resolved p3 3s |------------------------------|resolved 示例:一旦iterable中的某個(gè)promise變?yōu)閞ejected狀態(tài),返回的 promise就會(huì)變?yōu)閞ejected狀態(tài)。 var p1 = new Promise((resolve, reject) => { setTimeout(resolve, 1000, "one"); }); var p2 = new Promise((resolve, reject) => { setTimeout(resolve, 2000, "two"); }); var p3 = new Promise((resolve, reject) => { reject("reject"); }); const p = Promise.all([p1, p2, p3]).then(values => { console.log(values); //沒(méi)執(zhí)行 }).catch(reason => { console.log(reason); //"reject" }); 流程:p創(chuàng)建時(shí)為pending狀態(tài),p3先執(zhí)行完,p3的狀態(tài)變成rejected時(shí)觸發(fā)p變成rejected狀態(tài)。 p1 1s |----------|resolved p2 2s |--------------------|resolved p3 |-|rejected p rejected
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/105641.html
摘要:的翻譯文檔由的維護(hù)很多人說(shuō),阮老師已經(jīng)有一本關(guān)于的書了入門,覺(jué)得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過(guò)程中,顯得越來(lái)越重要。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書的目的是以目前還在制定中的ECMASc...
摘要:和和都有和,但是略有不同。實(shí)際上返回的是一個(gè)對(duì)象。和添加的回調(diào),添加的回調(diào)。所以在調(diào)用成功的情況下執(zhí)行添加的回調(diào),調(diào)用失敗時(shí)執(zhí)行添加的回調(diào)。,產(chǎn)生對(duì)象并,產(chǎn)生對(duì)象并,然后繼續(xù)處理,的語(yǔ)法糖,和的差不多但不同。 Deferred 和 Promise ES6 和 jQuery 都有 Deffered 和 Promise,但是略有不同。不過(guò)它們的作用可以簡(jiǎn)單的用兩句話來(lái)描述 Deffere...
摘要:所謂異步編程中的異步是相對(duì)于同步的概念的。是一系列異步編程規(guī)范的統(tǒng)稱。如果中的回調(diào)函數(shù)返回一個(gè)值,那么返回的將會(huì)成為接受狀態(tài),并且將返回的值作為接受狀態(tài)的回調(diào)函數(shù)的參數(shù)值。參考介紹基礎(chǔ)篇深入理解與異步編程。 es6 promise與異步編程 對(duì)于一些還不具備大量編程經(jīng)驗(yàn)的朋友來(lái)說(shuō),promise可能是es6比較難以掌握的點(diǎn)。首先是很多名詞,比如Promises,es6 Promise,...
摘要:從最開始的到封裝后的都在試圖解決異步編程過(guò)程中的問(wèn)題。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。寫一個(gè)符合規(guī)范并可配合使用的寫一個(gè)符合規(guī)范并可配合使用的理解的工作原理采用回調(diào)函數(shù)來(lái)處理異步編程。 JavaScript怎么使用循環(huán)代替(異步)遞歸 問(wèn)題描述 在開發(fā)過(guò)程中,遇到一個(gè)需求:在系統(tǒng)初始化時(shí)通過(guò)http獲取一個(gè)第三方服務(wù)器端的列表,第三方服務(wù)器提供了一個(gè)接口,可通過(guò)...
摘要:如果有錯(cuò)誤,則到的第二個(gè)回調(diào)函數(shù)中,對(duì)錯(cuò)誤進(jìn)行處理。假設(shè)第一個(gè)的第一個(gè)回調(diào)沒(méi)有返回一個(gè)對(duì)象,那么第二個(gè)的調(diào)用者還是原來(lái)的對(duì)象,只不過(guò)其的值變成了第一個(gè)中第一個(gè)回調(diào)函數(shù)的返回值。 ES6標(biāo)準(zhǔn)出爐之前,一個(gè)幽靈,回調(diào)的幽靈,游蕩在JavaScript世界。 正所謂: 世界本沒(méi)有回調(diào),寫的人多了,也就有了})})})})})。 Promise的興起,是因?yàn)楫惒椒椒ㄕ{(diào)用中,往往會(huì)出現(xiàn)回調(diào)函數(shù)一...
摘要:就算改變已經(jīng)發(fā)生了,即使再對(duì)對(duì)象添加回調(diào)函數(shù),也會(huì)立即得到這個(gè)結(jié)果。方法接收個(gè)參數(shù),第一個(gè)參數(shù)是狀態(tài)的回調(diào)函數(shù),第二個(gè)參數(shù)可選是狀態(tài)的回調(diào)函數(shù)。簡(jiǎn)單來(lái)講,就是能把原來(lái)的回調(diào)寫法分離出來(lái),在異步操作執(zhí)行完后,用鏈?zhǔn)秸{(diào)用的方式執(zhí)行回調(diào)函數(shù)。 在ECMAScript 6標(biāo)準(zhǔn)中,Promise被正式列為規(guī)范,Promise,字面意思就是許諾,承諾,嘿,聽(tīng)著是不是很浪漫的說(shuō)?我們來(lái)探究一下這個(gè)浪...
閱讀 1098·2021-11-23 10:11
閱讀 3947·2021-11-16 11:50
閱讀 1024·2021-10-14 09:43
閱讀 2775·2021-10-14 09:42
閱讀 2804·2021-09-22 16:02
閱讀 1130·2019-08-29 10:57
閱讀 3435·2019-08-29 10:57
閱讀 2354·2019-08-26 13:52