如何解决为什么我不能从 Node.js 中的函数中深入处理 DICT?
我正在使用 request 调用一个 API,该 API 在一个名为 body 的对象中为我提供电影数据,但是当我尝试将其传递给一个数组并控制台记录它时,终端会显示一个空数组。
let copy = [];
const request = require('request');
request('https://www.omdbapi.com/?t=JOKER&apikey=b04f2804',{ json: true },(err,res,body) => {
if (err) { return console.log(err);}
copy.push(JSON.parse(JSON.stringify(body)))
});
console.log(copy);
解决方法
首先,request()
库是 deprecated,不建议您使用它编写新代码。有一个替代方案列表(都支持承诺)here。
其次,request()
库是非阻塞和异步的。这意味着当您调用 request()
时,它开始操作然后立即返回。调用 request()
之后的代码会在 request()
调用其回调之前继续执行。因此,您试图在设置其值之前检查该数组。这是异步编程中的一个经典问题。有很多方法可以处理这个问题。如果您继续使用 request()
库,那么您必须在回调本身内部使用结果,或者您可以从该回调中调用其他一些函数并将其传递给数组。
使用列出的所有支持 promise 的替代方案之一(我最喜欢的是 got()
库),然后您可以使用 await
,它通常是异步操作的首选编程风格:
const got = require('got');
async function someFunction() {
let result = await got('https://www.omdbapi.com/?t=JOKER&apikey=b04f2804').json();
// you can use the result here
console.log(result);
// Or you can return it and it will become the resolved value
// of the promise this async function returns
return result;
}
someFunction().then(result => {
// can use result here
}).catch(err => {
console.log(err);
});
请注意,当您像执行 copy.push()
时那样将异步检索到的数据写入更高范围的变量时,这通常是警告您做错了什么。这是因为更高范围内的任何代码都不知道该变量中的数据何时可用。在极少数情况下您可能会这样做(例如实现缓存),但这些情况必须存储数据仅供将来参考,而不是立即使用。 99.9% 的情况下,当我们看到该构造时,这是使用异步检索数据进行编程的错误方式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。