而用Javascript(NodeJS)调用rest api并返回响应Undefined

时间:2019-05-03 09:37:56

标签: javascript node.js promise

当我调用rest API并返回响应时,它显示为未定义,但我在console.log此响应中返回

var request = require("request");

function initialize() {
  // Setting URL and headers for request
  var options = {
    url: 'http://postalpincode.in/api/pincode/400605',
    json: true
  };
  // Return new promise 
  return new Promise(function (resolve, reject) {
    // Do async job
    request.get(options, function (err, resp, body) {
      if (err) {
        reject(err);
      } else {
        resolve(JSON.stringify(body));
      }
    })
  })

}

function main() {
  var initializePromise = initialize();
  initializePromise.then(function (result) {
    return result;
  })
}
console.log('', main())

但是当我在控制台上记录此响应时,它会显示正确的输出

var request = require("request");

function initialize() {
  // Setting URL and headers for request
  var options = {
    url: 'http://postalpincode.in/api/pincode/400605',
    json: true
  };
  // Return new promise 
  return new Promise(function (resolve, reject) {
    // Do async job
    request.get(options, function (err, resp, body) {
      if (err) {
        reject(err);
      } else {
        resolve(JSON.stringify(body));
      }
    })
  })

}

function main() {
  var initializePromise = initialize();
  initializePromise.then(function (result) {
    console.log('', result)
  })
}
console.log('', main())

我想要当我调用rest API并返回响应时,它显示正确的输出

5 个答案:

答案 0 :(得分:1)

使用async/await

async function main() {
  var initializePromise = await initialize();
  console.log(initializePromise)
}

答案 1 :(得分:1)

then范围内的返回不是针对函数main的返回,而是仅针对诺言的then范围的返回。您需要像这样返回承诺:

function main() {
  var initializePromise = initialize();
  return initializePromise.then(function (result) {
    return result;
  })
}

main().then((result) => console.log('',result));

您无法使sync函数调用异步方法并期望获得其结果。

答案 2 :(得分:0)

我的问题是,为什么要在新的Promise中包装已经来自Promise的返回类型的东西?

您可以这样做:

request.get(endpoint, options).then((response) => console.log(response)).catch((error) => console.log(error));

让我知道在这种情况下的输出是什么。

答案 3 :(得分:0)

当从REST HTTP调用中获取响应时,initializePromise方法的当时解析会在以后阶段解决,即,由于调用async()是异步的,因此在返回main()方法时不会返回该响应。要处理此类代码,您应该使用回调

function main(completionHandler) {
  var initializePromise = initialize();
  initializePromise.then(function (result) {
    completionHandler(result);
  })
}
main((result) => { console.log(result)})

或诺言

function main() {
    // Return new promise 
    return new Promise(resolve => {
        var initializePromise = initialize();
        initializePromise.then(function (result) {
            resolve(result);
        })
    }
}

main().then(result => console.log(result));

答案 4 :(得分:0)

TOP_LEVEL_ROUTES

在主要功能中:

 const navigationList = TOP_LEVEL_ROUTES
    .map(({ exact = false, path, name }) => (
      <Button
        component={Link}
        to={path}
        key={path}
        exact={exact}
      >
        {name}
      </Button>
    ));