从函数的 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))
我被封锁几个小时了,我希望有人能帮我弄清楚我做错了什么。 整个代码用于从 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))