gpt4 book ai didi

node.js - NodeJS 上的阻塞功能

转载 作者:太空宇宙 更新时间:2023-11-03 22:11:55 26 4
gpt4 key购买 nike

我正在使用 NodeJS 为 API 构建 SDK,可以在 here 找到它。 。我的问题是,当用户声明模块时,它会提供我需要验证的用户名和密码,以及必须用于将来调用的 token 。因此,该 token 存储在 irecarga.token 中,对于以后的每次调用,我都必须使用它来识别用户。我的问题是,如果用户在声明后直接调用另一个函数,则声明可能无法及时完成(因为它执行 HTTP POST)并且属性 token 将为 null。

// module declaration which requires a HTTP call and updates irecarga.token
var irecarga = require('../')({
username: process.env.IRECARGA_USERNAME,
password: process.env.IRECARGA_PASSWORD
})

// function called straight after declaration which uses irecarga.token
irecarga.getServiceProviders(48, function(err, data){
// this code won't even run because the token = null will break the code
console.log('err: ', err)
console.log('data', data)
})

因此,我看到了很多使用 Node 创建阻塞函数的解决方案,我可以使用回调或其他模块来发送我想要作为其他函数的参数执行的函数。

这些解决方案很可能有效,但代码会变得丑陋且困惑。此外,我不认为我在创新,实际上这就是我看到像微软和谷歌这样的大公司声明他们的 API key 的方式。

我在这里遗漏了什么吗?我可以在验证函数中添加任何内容,使 iRecarga 的任何方法等待验证完成吗?

最佳答案

在 Node.js 中,您不会将异步事物变成阻塞事物。相反,您将它们用作异步并在它们之上创建一个异步接口(interface)。

因此,您需要为初始化提供一个异步接口(interface),以便调用者知道初始化何时完成以及何时安全或可以调用其他方法。有很多不同的方法可以做到这一点:

  1. require()() 返回一个 promise ,解析值是您的模块对象。然后,调用者执行 .then() 并在该回调中可以使用正确初始化的模块。

  2. 将回调传递到模块初始化中,并要求所有模块的使用都在该回调中进行(与上面的 promise 相同的概念,只是使用常规回调)。

  3. 不要将凭据传递给构造函数。相反,创建一个返回 promise 的异步 .login() 方法,并指示调用者不要使用该接口(interface),除非在已解析的登录 promise 内。

例如,它可能如下所示:

require('../')({
username: process.env.IRECARGA_USERNAME,
password: process.env.IRECARGA_PASSWORD
}).then(function(irecarga) {
// function called straight after declaration which uses irecarga.token
// this method should probably be changed to use promises
irecarga.getServiceProviders(48, function(err, data){
console.log('err: ', err)
console.log('data', data)
});
}).catch(function(err) {
// handle intiialization error here
});

关于node.js - NodeJS 上的阻塞功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39864014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com