【发布时间】:2021-03-23 01:57:41
【问题描述】:
我知道这个问题被问了很多次,但由于我还是新手,我不太明白以前地方的答案。
const publicIp = require('public-ip');
// getting ip address
async function GetIpAddress() {
var a = await publicIp.v4();
return await a;
// it will return my public ip as string
}
但是,由于它是非阻塞的,我明白如果我做如下这样的事情
var a = GetIpAddress();
console.log(a);
它可能会被承诺待定。所以我所做的是
async function hi(){
var a = await GetIpAddress();
console.log(a);
}
hi();
但这是我的问题。如何在不使用另一个函数来掩盖它的情况下将其返回到我的变量中?请看下面的代码
var zmq = require('zmq'),
requester = zmq.socket('req'),
publicIp = require('public-ip');
const PORT = "3222";
var IP = GetIpAddress();
console.log(`${IP}:${PORT}`);
// IP will return promise pending?? how i do fix this without making another
// function?
requester.connect('tcp://127.0.0.1:5433');
requester.on('message', function (msg) {
// arr = str.split(",");
console.log(msg.toString());
});
requester.send(
`${IP}:${PORT}`
);
async function GetIpAddress() {
var a = await publicIp.v4();
return a
}
正如上面显示的完整代码.. var IP 肯定会被承诺待定,因为这需要时间。那么如何在不创建另一个函数的情况下获取函数返回值呢?
编辑:请理解重复完全不是我想要的。我知道我对回调、承诺和异步等待的知识并不强,而是来自一个来自同步语言(如 Python 本身)的人。我很好奇如何取出变量。因为我研究和看到的大多是
承诺中的承诺或回调中的回调。
我想要的是如果我可以复制如下所示的内容(python)
def f(x):
return x+1
var1 = 5
var1 = f(var1)
# var1 is now 6
这将回调/承诺/异步等待变量带出它自己的函数而不是
var IP = GetIpAddress().then((IP) => {
requester.connect('tcp://127.0.0.1:5433');
console.log('Worker connected to port 5433');
requester.on('message', function (msg) {
// arr = str.split(",");
console.log(msg.toString());
});
requester.send(
`${IP}:${PORT}`
);
console.log(`${IP}:${PORT}`);
});
【问题讨论】:
-
作为一个python背景的人,我很好奇的是把价值从promise的把握中拿出来,放回那些功能之外。我看到的主要还是函数中的函数。我想要的是如何将变量带出函数。因此它不是重复的
-
链接已失效
-
不客气。 JS 中的异步执行一开始可能会让人很困惑,尤其是在过去几年它一直在不断变化的情况下。正如 Medium 文章所建议的那样(链接似乎有效),从理解 Promise 开始,然后按照自己的方式学习 async/await 语法。
标签: node.js asynchronous