Node.jsの] [匿名関数 - 閉鎖-Promise

JavaScriptの中、

  • 匿名コールバック関数は、多機能とクロージャを実現するために使用しました
  • = +閉鎖機能基準環境、
  • promiseそれはES6、いくつかの将来のイベントは終了します保存標準言語、(通常は非同期操作)の結果を。
const promise = new Promise(function(resolve, reject) {
  // ... some code

  if (/* 异步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

I.はじめに

オペレーション、ビジネス機能がある:スキャンタスクサイクルは、各サイクルは、データをスキャンし、その後、サイクル数に応じて格納されelasticsearch、今は、データがサポートするデータ関連付けられた各サイクル間で重複するかどうかに必要周期スナップショット機能を介して、Query DSL +kibana可視化クエリ、またはあまりにも苦労し視覚的に比較による。kibanaまたによってhttp post要求し、データを返しjson、その後、我々は、シミュレートすることができkibana、データを取得するための要求を、隣接するサイクルデータ、出力ファイル、小型爬虫類やデータ分析のガジェットのアイデアよりも、コードを気にしています。

1.最初のindex.js

会社の実際のコードので、サンプルコードは、変更されているurl百度に置き換え、post置き換えget

const http = require('https');

function spider() {
    for (i = 0; i < 9; i++) {
        //i为某个周期参数
        http.get('https://www.baidu.com/', function (res) {
            console.log(`当前i:${i}`);
            console.log(`状态码${res.statusCode}`);
        })
    }
}

spider()

node .\src\server\index.js

当前i:9  
状态码200
当前i:9  
状态码200
当前i:9  
状态码200
当前i:9  
状态码200
当前i:9  
状态码200
当前i:9  
状态码200
当前i:9  
状态码200
当前i:9  
状态码200
当前i:9  
状态码200

それはなぜでしょうか?のでhttp.get非同期メソッド、およびサイクルを継続する、待機しません、i値がすぐに変更されますが、今回は非同期メソッドiの参照は9になります。我々は間違いなく、出力の異なるしたいi期間に対応するデータを見て、値。方法は?無名関数

2. 2番目のindex.js

const http = require('https');

function spider() {
    for (i = 0; i < 9; i++) {
        //闭包
        //匿名函数+立即执行
        (function (i) {
            http.get('https://www.baidu.com/', function (res) {
                console.log(`当前i:${i}`);
                console.log(`状态码${res.statusCode}`);
            })
        })(i)
    }
}

spider()

node .\src\server\index.js

当前i:1
状态码200
当前i:6
状态码200
当前i:5
状态码200
当前i:2
状态码200
当前i:4
状态码200
当前i:3
状态码200
当前i:0
状态码200
当前i:8
状态码200
当前i:7
状态码200

= +クロージャー関数リファレンス環境、匿名関数は、関数、それが基準環境パラメータ渡されているi値を

3.第三のindex.js

需要が期間を見ている場合は、次の期間のデータを、このkey:value要求は、上記の基本的なニーズが満たされている、と彼らは匿名関数がうまく+がすぐに実行には理解されていないと感じた場合、形質転換後、鼓動は理解しています。

const http = require('https');

//let map=new Map();

function getData(i) {
    http.get('https://www.baidu.com/', function (res) {
        console.log(`当前i:${i}`);
        console.log(res.statusCode);
        //map.set ...
    })
}

function spider() {
    for (i = 0; i < 9; i++) {
        getData(i)
    }
}

spider()

しかし、今、私たちはすべてのサイクルとサイクルのデータがアップ保たれている必要があり、その後、データ分析を行います。つまり、複数の非同期のHTTPリクエストで、私たちは一緒に共存し、彼らは分析を行うことができ、ループ、すべての実行を作成する必要があり、データを返します。グローバル変数定義、これが非同期であることを忘れないでくださいlet map=new Map();と非同期コールバックmap.setは機能しません。この時であるPromiseときのステージ。

4.第四index.js

const http = require('https');

//定义一个数组
let array = Array();

//定义一个数组
let promiseArray = []

//定义一个map
let map=new Map();

function getData(i) {
    return new Promise((resolve,reject) => {
        http.get('https://www.baidu.com/', function (res) {
            console.log(`当前i:${i}`);
            console.log(res.statusCode);
            
            array.push(i);
            map.set(i,res.statusCode);
            
            resolve();
        })
    })
}

function spider() {
    console.log('开始循环创建promiseArray');
    for (i = 0; i < 9; i++) {
        promiseArray.push(getData(i))
    }
    console.log('结束循环创建promiseArray');
}

spider();

//Promise.all(iterable) 方法返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);如果参数中  promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果。
Promise.all(promiseArray).then(function(){
    console.log(array.length);
    console.log(array);  
    console.log(map);  
})

各非同期要求を作成するためにPromiseオブジェクトをストレージに入れPromise、その後呼び出して、配列オブジェクトPromise.allまたはへの復帰Promise条件として、彼の完全なコールバックがありPromise、アレイ内の各オブジェクトresolveは、すべての非同期要求が完了しています、。

开始循环创建promiseArray
结束循环创建promiseArray
当前i:7
200
当前i:4
200
当前i:1
200
当前i:2
200
当前i:6
200
当前i:5
200
当前i:8
200
当前i:3
200
当前i:0
200
9
[
  7, 4, 1, 2, 6,
  5, 8, 3, 0
]
Map {
  7 => 200,
  4 => 200,
  1 => 200,
  2 => 200,
  6 => 200,
  5 => 200,
  8 => 200,
  3 => 200,
  0 => 200
}

おすすめ

転載: www.cnblogs.com/RandyField/p/12508286.html