javascript - 如何运行依赖于第一个 api 中设置的变量的 api?

标签 javascript node.js asynchronous request

我正在尝试从 api 创建 Node 种子脚本。该 API 在多个页面中显示,并有一个名为“numberOfPages”的属性。

在每一页上,我都会播种一个数据库。因此,我打算采用“numberOfPages”变量并使用 X 页面的适当 api 响应运行 for 循环。目前,在运行 .on 函数时,numberOfPages 显示为未定义。当我在下面的 if 语句中运行它时,它确实会显示。异步执行此操作的适当方法是什么?

"use strict"

var express = require('express');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var request = require('request');

let key = 'MAGICNUMBER';
let baseRequest = "http://apiurl?key=" + key;


mongoose.connect("mongodb://localhost:27017/myDatabase");
const db = mongoose.connection;
// mongo error
db.on('error', console.error.bind(console, 'connection error:'));`
    function populateController(){
      let numberOfPages;
      request(apiRequest, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            let apiResponse = JSON.parse(body);
            numberOfPages = parseInt(apiResponse.numberOfPages);
        }
      }).on('end', () => {
        console.log('ended');
        console.log(numberOfPages);
      }) })

最后祝大家节日快乐。

最佳答案

你的代码对我来说似乎很好,它应该可以工作。我已经在您的代码中添加了一些日志记录。

function populateController(){
  let numberOfPages;
  console.log('Starting');
  request(apiRequest, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      let apiResponse = JSON.parse(body);
      numberOfPages = parseInt(apiResponse.numberOfPages);
      console.log('Result', numberOfPages);
    }
    else {
      console.error('Error in request', response.statusCode, err);
    }
  }).on('end', () => {
    console.log('Ended', numberOfPages);
  });
});

应该这么写,还是有些错误。

Starting
Result 42
Ended 42

顺便说一句,异步事情非常困惑。我建议使用异步等待。你需要习惯它们,并且不能完全离开 Node 回调。尽管如此,他们可能会让事情变得更干净。

加上相关帖子:Why doesn't request.on() work in Node.js -- 注意同步/异步执行顺序!一些日志记录可以帮助您了解执行顺序。

节日快乐!

关于javascript - 如何运行依赖于第一个 api 中设置的变量的 api?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41316729/

相关文章:

node.js - Restful API 中的 Bunyan logger.info 错误

node.js - Heroku Node 应用程序不断崩溃

node.js - 使用 Chai Expect throw 不捕获 Promise 拒绝

c - 需要说明在 GNU C 中使用 settimer 和 alarm 函数的程序

c# - 异步 - 等待直到有人尝试连接

javascript - 为什么这个 event.url 起作用而不是这个

javascript - 如何从 Controller 启动和重置 Angular 计时器?

javascript - JavaScript 的正则表达式不起作用

Javascript,改变对象值

python - 如何在 Tornado 中立即发送 GET 响应?