微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我不能从 Node.js 中的函数中深入处理 DICT?

如何解决为什么我不能从 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?