非常简单的Node.js API调用返回'undefined'

时间:2018-01-28 11:40:57

标签: javascript json api

我一直在浏览教程和浏览页面,但仍然不明白什么是遗漏/错误(我知道,即使是最终的初学者水平我也失败了。)

我的目标是获得属性'market_ask'的价值,但我收到结果'未定义' 你们中的任何人都能给我一些指示吗? API文档位于https://developers.quoine.com/#get-products

var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var xhr = new XMLHttpRequest();

xhr.open("GET", "https://api.quoine.com", false);
xhr.send("GET", '/products/1' );

console.log(xhr.responseXML.market_ask);

1 个答案:

答案 0 :(得分:0)

XMLHTTPRequest是异步的,即当代码到达console.log()时,响应尚未到达。

以下内容应该有效:

const XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
const xhr = new XMLHttpRequest();

// completion callback
xhr.addEventListener("load", () => {
    console.log(xhr);
    console.log(xhr.responseText);
    const data = JSON.parse(xhr.responseText);
    console.log(data.market_ask);
});

xhr.open("GET", "https://api.quoine.com/products/1");
xhr.send();

编辑上面我得到以下输出:

$ node xmlhttprequest.js 
{ UNSENT: 0,
  OPENED: 1,
...
  responseText: '{"id":"1",...}',
  responseXML: '',
...
  dispatchEvent: [Function] }
{"id":"1",...,"market_ask":10084.236,...}
10084.236

如果您可以使用jQuery,即您的脚本将在浏览器中运行,那么我建议使用带有承诺的ajax(),例如。

$.ajax('https://api.quoine.com/products/1')
 .then(() => {
     // success ...
 })
 .catch(error => {
     // failure ...
 });

EDIT2 这是使用Promisesin Node.js,f.ex包装第一个变体的方法。作为效用函数:

const XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
new Promise((resolve, reject) =>
    {
        const xhr = new XMLHttpRequest();
        xhr.addEventListener("load", () => {
            try {
                if (xhr.status !== 200)
                    throw new Error(`request failed with ${xhr.status}`);
                const response = JSON.parse(xhr.responseText);
                resolve(response);
            } catch (e) {
                reject(e);
            }
        });
        xhr.addEventListener("error", reject);
        xhr.open("GET", "https://api.quoine.com/products/1");
        xhr.send();
    })
    .then(response => {
        console.log("Market ask", response.market_ask);
    })
    .catch(error => {
        console.log(error.message);
    });