从函数的 return 得到不同的答案

Got different answer from a return of a function

我被封锁几个小时了,我希望有人能帮我弄清楚我做错了什么。 整个代码用于从 API 获得 json 响应。我想了解我的错误是什么,所以请稍微解释一下! ;)

const fetch = require('node-fetch');
const Bluebird = require('bluebird');
fetch.Promise = Bluebird;
const xml2js = require('xml2js');

module.exports = {

    getImage : async function (tag, random){
        
        let url = "anApiLink" + tag;

        if(random != null) url = "anApiLink" + tag + "&id=" + random;
        
        const get_data = async url => {
            
            try {
                const response = await fetch(url);
                
                if(! response.ok) return new Error("Erreur lors de la récupération de l'image : " + response.statusText);
                
                const text = await response.text();



                const xmlToJson = await xml2js.parseString(text, (err, result) => {
                    
                    if(err) throw err;

                    const json = JSON.stringify(result, null, 4);  

                    return json;
                });
                
                console.log(xmlToJson);
                return xmlToJson;

            } catch (err) {
                console.error(err);
            }
        };

        return get_data(url);
            
    }
}

我的 json const 是我想从全局函数 (get_data) return 得到的,这是一个很好的 json 答案。通过我的最终 return,我实际上得到了下面的内容。

来自我的 console.log() :

{
  comment: '',
  sgmlDecl: '',
  textNode: '',
  tagName: '',
  doctype: '',
  procInstName: '',
  procInstBody: '',
  entity: '',
  attribName: '',
  attribValue: '',
  cdata: '',
  script: '',
  c: '',
  q: '',
  bufferCheckPosition: 65536,
  opt: { trim: false, normalize: false, xmlns: false, lowercase: undefined },
  looseCase: 'toUpperCase',
  tags: [],
  sawRoot: false,
  closedRoot: false,
  closed: false,
  error: null,
  tag: null,
  strict: true,
  noscript: true,
  state: 0,
  strictEntities: undefined,
  ENTITIES: {},
  attribList: [],
  trackPosition: true,
  column: 0,
  line: 0,
  position: 0,
  errThrown: false,
  onerror: [Function],
  onend: [Function],
  ended: true,
  onopentag: [Function],
  onclosetag: [Function],
  ontext: [Function],
  oncdata: [Function],
  startTagPosition: 781
}

感谢您的帮助。

您好,起初我什至没有意识到我在阅读您的代码中的法语...您的问题似乎与您正在使用的库有关,xml2js。我看了一下他们的文档,也许 this may help you.

函数本身不会 return 结果,但您可以在回调中获得它,这就是您记录这个奇怪对象的原因。您可以创建一个单独的 var 来存储结果,但我有更好的解决方案。

如果你想使用promises,我在关于parseStringPromise的源代码中找到了this in the docs, and this,我想这就是你想要的。源代码表明结果在此处 returned 作为 Promise。

简而言之,您在回调中 return 的内容不是 return 由 parseString 编辑的。这就是 xmlToJson 应该按预期行事的方式。

// Not tested. I might have made an error about the location of 'then', not sure.
const xmlToJson = await xml2js.parseStringPromise(text)
  .catch(e => throw e)
  .then(r => JSON.stringify(r, null, 4))