javascript --- 使用run函數,讓100條ajax依次執行

使用如下:

function *foo(len,urlArray) {let r = [];for(let i =0; i< len; i++){r[i] = yield request(urlArray[i]);}
}
// len:是長度,urlArray,是請求的url數組..

下面附上run函數的代碼,以及證明以上是成立的

// Benjamin Gruenbaum(@benjamingr on Github)
function run(gen) {var args = [].slice.call(arguments, 1), it;it = gen.apply(this, args);return Promise.resovle().then(function handleNext(value) {var next = it.next(value);return (function handleResult(next) {if( next.done) {return next.value;} else{return Promise.resolve(next.value).then(handleNext,function handleErr(err) {return Promise.resolve(it.throw(err)).then(handleResult);}};}})(next);});
}
// emmmm,這個run我是沒有看懂的,也不想檢查有沒有打錯....其實我想說的是..利用Promise并發.

考察下面函數:

function *foo(){var r1 = yield request("http://some.url.1");var r2 = yield request("http://some.url.2");var r3 = yield request("http://some.url.3/?v=" + r1 + "," + r2);console.log(r3);
}
run(foo);
// 以上2個ajax請求是依此進行的.即:r1完成后,r2開始...
// 高效的程序是讓r1和r2同時進行(并發)
// 改寫如下:
function *foo(){var p1 = request("http://some.url.1");var p2 = request("http://some.url.2");var r1 = yield p1;var r2 = yield p2;var r3 = yield request("http://some.url.3/?v=" + r1 + "," + r2);console.log(r3);
}
run(foo);// 同時發出2個ajax請求.使用yield語句等待promise的決議.

這個也很像Promise.all方法

function *foo(){var results = yield Promise.all([request("http://some.url.1"),request("http://some.url.2")]);var r1 = results[0];var r2 = results[1];var r3 = yield request("http://some.url.3/?v=" +r1 + "," +r2);console.log(r3);
} run(foo);

更理想的情況是,我們希望使用bar()給我們結果(通過yield來等待),而不關心底層到底是使用Promise.all還是Promise.

function bar(url1, url2) {return Promise.all([request(url1),request(url2)]);
}function *foo(){var results = yield bar("http://some.url.1","http://some.url.2");var r1 = results[0];var r2 = results[1];var r3 = yield request("http://some.url.3/?v=" + r1 + "," + r2);console.log(r3);
}
run(foo);
// 使用bar將Promise層封裝起來,不需要關心底層的實現.
// 如果將Promise直接放在生成器內部的話,在高層次的任務表達中邏輯會變得混亂

參考《你不知道的JavaScript》(中卷)P256~P261

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251185.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251185.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251185.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉]IIS 允許/禁止 目錄瀏覽

<?xml version"1.0" encoding"utf-8"?> <configuration><system.webServer><directoryBrowse enabled"true" /></system.webServer> </configuration> enabled true -> 允許目錄瀏覽&#xff0c;子目…

C++編程基礎一 06-布爾類型

1 // 06-布爾類型.cpp: 定義控制臺應用程序的入口點。2 //3 4 #include "stdafx.h"5 #include <iostream>6 using namespace std;7 8 int main()9 { 10 bool a true; //真 存在的 非零 1 11 bool b false;//假 不存在 零 0 12 cout << …

性能優化雜記

webpack 開發、生產環境配置不同的webpack配置文件 生產環境刪除devServer&#xff08;不需要啟webpack devServer&#xff09; 告訴webpack&#xff0c;生產、開發分別要對應哪個配置文件 開發環境下也能看到打包的結果 npm run dev:build npm run dev 只會把打包生產…

算法 --- 冒泡排序、選擇排序、插入排序的js實現

冒泡排序: function bubbleSort(arr){let i arr.length;while(i >0){for(let j 0; j< i; j) {let pos 0;if(arr[j] > arr[j1]) {pos j;let temp arr[j];arr[j] arr[j1];arr[j1] temp;}}i pos;}return arr; } var arr [3,44,38,5,47,15,36,26,27,2,46,4,19,5…

appium--每次啟動會重新安裝的問題(沒試過)

有人說加這個 最后 大神說 在appium哪里就可以設置了 對&#xff0c;第一個不勾選就不會安裝了【經理】[Java]大連●Messi_Z(726862194) 15:54:10把這些東西全去掉就好了轉載于:https://www.cnblogs.com/kaibindirver/p/8205031.html

爬蟲從入門到放棄 - 純新手學習-爬蟲基本原理

1.什么是爬蟲&#xff1f; 請求網站并提取數據的自動化程序 請求&#xff1a;客戶端向服務端發送請求獲得網頁資源&#xff0c;是一段html代碼&#xff0c;包含html標簽和一段信息。 提取&#xff1a;提取出想要的信息&#xff0c;然后將結構化的數據存儲到文本 自動化&#xf…

ES5-11原型與原型鏈深入、對象繼承

原型 誰調用&#xff0c;this就指向誰&#xff0c;當實例對象有該屬性時&#xff0c;不會去原型上查找 創建對象的兩種方法&#xff1a;字面量、new Object&#xff08;&#xff09;一般不用后面的二者創建出來的對象沒有差異 Object.create() var 實例 Object.create(對象…

算法 --- 希爾排序、歸并排序、快速排序的js實現

希爾排序: function shellSort(arr) {let len arr.length;let temp, gap 1;while(gap < len/3) {gap gap*3 1}while(gap >1) {for(let i gap;i< len; i) {temp arr[i];for( var j i-gap; j> 0 && arr[j] > temp; j - gap) {arr[j gap] arr[j];}…

蘋果和蟲子問題C++

如果需要轉載&#xff0c;請注明出處&#xff1a;http://www.cnblogs.com/wongyi/p/8205305.html 最近在給小朋友補奧數課&#xff0c;順便看了幾道題目&#xff0c;覺得寫出來會比較集中&#xff0c;整理一下哈哈哈。 問題如下&#xff1a; 蘋果和蟲子&#xff1a; 你買了一箱…

SQL SERVER 打開腳本報“未能完成操作,存儲空間不足”

使用用SQLCMD命令行。 1、快捷鍵&#xff1a;winR 2、輸入cmd?&#xff0c;確定 3、輸入命令&#xff1a;sqlcmd -S <數據庫服務器名稱> -i C:\<腳本文件路徑>.sql 例&#xff1a;sqlcmd -S lgsp_PC -i D:\test.sql P.S.1:最好在你的腳本中使用:use 數據庫名(你要…

ES5-12 【utils】繼承深入、call、apply、圣杯模式、模塊化

繼承深入 這兩種方式繼承不夠合理&#xff08;為什么&#xff09; 將實例作為子類的原型 在子類的構造函數內部借用父類的構造函數 將父類的原型作為子類的原型&#xff08;會修改父類的原型&#xff09; css圣杯布局&#xff08;左右寬度固定、中間自適應&#xff09…

vue實現星級評價效果

希望對你們有用&#xff0c;已經自己試過可以的才發布出來的 效果如下&#xff1a; html&#xff1a; <template> <div class"evaStar"> <ul class"star"> <li v-for"(itemClass,index) in itemClasses" :class"itemC…

算法 --- 二叉樹查找樹的先序(中序、后序)遍歷的js實現

結點: function Node(data, left, right) {this.data data;this.left left;this.right right;this.show show; }顯示樹的數據: function show(){return this.data; }二叉查找樹: // Binary Search Tree function BST(){this.root null;this.insert insert; }添加結點到…

第三周學習

一直在練車&#xff0c;沒有學習轉載于:https://www.cnblogs.com/wj1998/p/9668534.html

IDEA的十大快捷鍵

Intellij IDEA中有很多快捷鍵讓人愛不釋手&#xff0c;stackoverflow上也有一些有趣的討論。每個人都有自己的最愛&#xff0c;想排出個理想的榜單還真是困難。以前也整理過Intellij的快捷鍵&#xff0c;這次就按照我日常開發時的使用頻率&#xff0c;簡單分類列一下我最喜歡的…

ES5-13 對象屬性遍歷、this、callee、caller

鏈式調用 在每個函數內部return this 訪問對象屬性 點語法[]中括號內是字符串或是變量 數組是特殊的對象 對象屬性遍歷 for in(遍歷對象或數組) - 不必再用Object.keys那么麻煩了 for(var key in obj){console.log(obj[key])// obj.key返回undefined// 因為js引擎會轉換為…

算法 --- 順序查找、二分查找的js實現

順序查找: function seqSearch(arr, data) {for(let i 0; i< arr.length;i) {if(data arr[i]) {return i;}}return -1 } var arr[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; console.log(seqSearch(arr, 15))二分查找: function binSearch(arr, data) {let low 0;let…

字符串連接(貪心)

輸入n個字符串s[i]&#xff0c;你要把他們按某個順序連接起來&#xff0c;使得字典序最小。 (1 < n < 100) (每個字符串長度 < 100) (字符串只包含小寫字母) Input 第一行一個整數n。 接下來每行一個字符串s[i]。 Output 一行一個字符串表示把輸入的n個字符串按某個順…

hibernate課程 初探單表映射3-1 hibernate單表操作簡介

本章簡介&#xff1a; 1    單一主鍵 2    基本類型 3    對象類型 4    組件屬性 5    單表操作CRUD實例轉載于:https://www.cnblogs.com/1446358788-qq/p/8232078.html

vue --- cdn導入,一些基本操作

使用cdn導入vue.并使用vue做一些簡單的操作. cdn導入vue: <script src"https://cdn.jsdelivr.net/vue/2.1.3/vue.js"></script>vue-router的CDN導入: <script src"https://unpkg.com/vue-router2.5.3/dist/vue-router.js"></scrip…