等待定义变量?

Waiting for variables to be defined?

我是 JS 新手,我正在尝试制作一个 API 向其他网站发出一些请求,然后在 ejs 模板中呈现数据。

我有一些函数可以发出请求,但是当我尝试访问结果时,我得到的变量未定义。

这是我的代码:

function callback_breakout(error, response, body) {
    if (!error && response.statusCode == 200) {
        // console.log(body);
        var data = JSON.parse(body)
        breakout_result = data.result
        console.log(breakout_result)
    }
}

function callback_vendor(error, response, body) {
    if (!error && response.statusCode == 200) {
        // console.log(body);
        var data = JSON.parse(body)
        vendor_result = data.result
        console.log(vendor_result)
    }
}

request(options_breakout, callback_breakout);
request(options_vendor, callback_vendor);

res.render('report',{
    breakout_result,
    vendor_result
})

错误:

(node:2224) UnhandledPromiseRejectionWarning: ReferenceError: breakout_result is not defined

将 breakout_result 和 vendor_result 设为全局。

像这样:

var breakout_result, vendor_result;

    function callback_breakout(error, response, body) {
        if (!error && response.statusCode == 200) {
            // console.log(body);
            var data = JSON.parse(body)
            breakout_result = data.result
            console.log(breakout_result)
        }
    }
    
    function callback_vendor(error, response, body) {
        if (!error && response.statusCode == 200) {
            // console.log(body);
            var data = JSON.parse(body)
            vendor_result = data.result
            console.log(vendor_result)
        }
    }

request(options_breakout, callback_breakout);
request(options_vendor, callback_vendor);

res.render('report',{
    breakout_result,
    vendor_result
})

第一种方式是setInterval::

var breakout_result = null;
var vendor_result = null;

function callback_breakout(error, response, body) {
    if (!error && response.statusCode == 200) {
        // console.log(body);
        var data = JSON.parse(body)
        breakout_result = data.result
        console.log(breakout_result)
    }
}

function callback_vendor(error, response, body) {
    if (!error && response.statusCode == 200) {
        // console.log(body);
        var data = JSON.parse(body)
        vendor_result = data.result
        console.log(vendor_result)
    }
}

request(options_breakout, callback_breakout);
request(options_vendor, callback_vendor);


var interval = setInterval(function() {
   if ( breakout_result !== null && vendor_result !== null ) {
       clearInterval(interval);
        
       res.render('report',{
          breakout_result,
          vendor_result
       });
   }
}, 500);

第二种方式是使用callback::

var breakout_result = null;
var vendor_result = null;

function callback_breakout(error, response, body) {
    if (!error && response.statusCode == 200) {
        // console.log(body);
        var data = JSON.parse(body)
        breakout_result = data.result
        console.log(breakout_result)
    }
}

function callback_vendor(error, response, body) {
    if (!error && response.statusCode == 200) {
        // console.log(body);
        var data = JSON.parse(body)
        vendor_result = data.result
        console.log(vendor_result)
    }
}

// init request1
request(options_breakout, function() {
   callback_breakout(); // process request1

   // init request2
   request(options_vendor, function() {
        callback_vendor(); // process request2

        // now render content
        res.render('report',{
          breakout_result,
          vendor_result
       });
   });
});

在breakout_result前面使用var或let。但是如果你在一个函数中声明一个变量 你不能在函数外使用它 所以如果你在不同的地方需要这个变量,比如

res.render('report',{
breakout_result,
vendor_result
})

你应该在函数外声明变量(全局范围) 像那样

var breakout_result;
var vendor_result;
function callback_breakout(error, response, body) {
if (!error && response.statusCode == 200) {
    // console.log(body);
    var data = JSON.parse(body)
        breakout_result = data.result
    console.log(breakout_result)
  }
}
function callback_vendor(error, response, body) {
  if (!error && response.statusCode == 200) {
    // console.log(body);
    var data = JSON.parse(body)
        vendor_result = data.result
    console.log(vendor_result)
  }
}

    request(options_breakout, callback_breakout);
    request(options_vendor, callback_vendor);

    res.render('report',{
        breakout_result,
        vendor_result
    })