4

グローバル変数に空の配列を代入しますartistURLs。次に、文字列 (ローカル変数artistURL) をartistURLsCheerio.each()イテレーター メソッドで配列にプッシュします。

var request = require('request'),
  cheerio = require('cheerio'),
  url = 'http://www.primarytalent.com/',
  artistURLs = [];

request(url, function(err, resp, body){
  if(err)
    throw err;
  $ = cheerio.load(body);
  $('#rosterlists div li a').each(function(){
    var urlCap = this.attr('href').slice(1);
    var artistURL = url.concat(urlCap);
    artistURLs.push(artistURL);
  });
  console.log(artistURLs);
});

私はそれartistURLが正常にプッシュされているartistURLsことを知っています

console.log(artistURLs);

端末に入力された配列が表示されます。問題はconsole.log(artistURLs);、グローバル スコープでコールバック関数の外で実行しようとした場合です。例えば

var request = require('request'),
  cheerio = require('cheerio'),
  url = 'http://www.primarytalent.com/',
  artistURLs = [];

request(url, function(err, resp, body){
  if(err)
    throw err;
  $ = cheerio.load(body);
  $('#rosterlists div li a').each(function(){
    var urlCap = this.attr('href').slice(1);
    var artistURL = url.concat(urlCap);
    artistURLs.push(artistURL);
  });
});

console.log(artistURLs);

console.log(artistURLs);の外に移動したことがわかりますrequest()。何らかの理由artistURLsで、グローバル スコープでアクセスしようとすると、`request()~ で発生したすべての処理がまったく発生しなかったかのように、空の配列が返されます。

なぜこれが起こっているのですか?artistURLsまた、プッシュされているすべての URL が.artistURLs

ありがとう

4

1 に答える 1

1

request()モジュールは非同期であるため、console.log()を使用すると HTTP 呼び出しが完了する前に実行されますconsole.log()。たとえば、次のコードを見てください。

var request = require('request');
var cheerio = require('cheerio');
var url = 'http://www.primarytalent.com/';
var artistURLs = [];

request(url, function(err, resp, body){
  if (err)
    throw err;
  $ = cheerio.load(body);
  $('#rosterlists div li a').each(function(){
    var urlCap = this.attr('href').slice(1);
    var artistURL = url.concat(urlCap);
    artistURLs.push(artistURL);
    console.log('push');
  });
});

console.log(artistURLs);

次の結果が表示されます。

[]
push
push
...
push
push
push

これを防ぐartistURLsには、HTTP 要求コールバック内でのみ変数を使用してください。

于 2013-09-20T02:02:31.150 に答える