您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)node.js中怎么判斷執(zhí)行是否完成,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
方案一:判斷請求到的數(shù)據(jù)條目
// 模擬網(wǎng)絡(luò)請求 function fetch(url, callback) { setTimeout(function (){ callback(null, { subjects: [{ data: Math.round(Math.random() * 100) }] }); }, 2000); } // 實(shí)現(xiàn)方案1 function multiTask_1 () { var arr = []; var baseUrl = 'https://api.douban.com/v2/movie/top250'; for (var start = 0; start < 10; start++) { var url = baseUrl + '?start=' + start + "&count=1"; fetch(url, function(error, res) { var data = res.subjects; arr = arr.concat(data); // 調(diào)用完成后統(tǒng)一處理 if (arr.length === 10) { console.log(arr); } }); } }
將運(yùn)行結(jié)果用arr.length
來判斷,如果arr.length
不像我們期望的那樣,比如由于網(wǎng)絡(luò)傳輸或者處理異常,少一條,那么我們將無法做后續(xù)的處理。這種處理方式強(qiáng)業(yè)務(wù)耦合;不具有普適性。
方案二:判斷異步過程執(zhí)行次數(shù)
// 方案2 function multiTask_2 () { var taskWatcher = 0; var arr = []; var baseUrl = 'https://api.douban.com/v2/movie/top250'; for (var start = 0; start < 10; start++) { taskWatcher++; var url = baseUrl + '?start=' + start + "&count=1"; fetch(url, function(error, res) { var data = res.subjects; arr = arr.concat(data); taskWatcher--; if (taskWatcher === 0) { console.log(arr); } }); } }
方案2 的判斷條件,這里的 taskWatcher 充當(dāng)異步任務(wù)執(zhí)行情況的觀察員,僅與異步過程的調(diào)用次數(shù)有關(guān),且與其他處理過程無關(guān)。那有沒有其他方案呢
方案三:Promise.all()
Promise.all(iterable)
方法返回一個(gè) Promise, 它將在上述可迭代對象中的所有 Promise 被 resolve 之后被 resolve,或者在任一 Promise 被 reject 后被 reject。
function multiTask_3 () { // var taskWatcher = 0; var taskStack = []; var arr = []; var baseUrl = 'https://api.douban.com/v2/movie/top250'; for (var start = 0; start < 10; start++) { taskStack.push( new Promise((resolve, reject) => { var url = baseUrl + '?start=' + start + "&count=1"; fetch(url, function(error, res) { var data = res.subjects; arr = arr.concat(data); resolve(); }); }) ); } Promise.all(taskStack).then(function () { console.log(arr); }); }
這種方式更具有通用性,如果異步任務(wù)類型不同,也可以用這種方式來解決。不過應(yīng)當(dāng)注意reject的處理。避免其對最終處理的影響。
方案四: EventProxy
EventProxy是樸靈寫的,https://github.com/JacksonTian/eventproxy
var ep = new EventProxy(); var arr = []; ep.after('fetchData', 10, function (list) { list.forEach(function(item){ arr = arr.concat(item); }); console.log(arr); }); var baseUrl = 'https://api.douban.com/v2/movie/top250'; for (var start = 0; start < 10; start++) { var url = baseUrl + '?start=' + start + "&count=1"; fetch(url, function(error, res) { var data = res.subjects; ep.emit('fetchData', data); }); }
EventProxy基于事件訂閱/發(fā)布模式,這里的after 方法可以偵聽多次事件,回調(diào)中保存了多次異步任務(wù)的數(shù)據(jù)結(jié)果的數(shù)組;除此之外EventProxy還支持多個(gè)不同事件的偵聽和處理。
看完上述內(nèi)容,你們對node.js中怎么判斷執(zhí)行是否完成有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。