我知道这个问题已被多次询问,但由于我还很新,所以我不太了解以前的地方的答案。
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
将callbacks / promises / async等待变量带出自己的函数而不是
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}`);
});
答案 0 :(得分:0)
变化:
var IP = GetIpAddress();
console.log(`${IP}:${PORT}`);
为:
GetIpAddress().then((IP) => {
console.log(`${IP}:${PORT}`);
}
);
您可以阅读6 Reasons Why JavaScript’s Async/Await Blows Promises Away (Tutorial)
更新
选项1将所有内容都放在then
:
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}`);
});
选项2是将所有内容包装在async
函数中:
async function hi(){
var a = await GetIpAddress();
console.log(a);
}
hi();
选项2是我选择的选项,因为它提供了一种更清晰的写作方式。
答案 1 :(得分:0)
你需要在方法调用之前添加await。 main 方法也需要异步。
var IP = await GetIpAddress();
尝试使用
new promise(function (accept, reject){ // if Ip found
accept("ipaddress") //else reject("error log")
}).then(function(response){ // this is accept , print IPaddress
}).catch(function(err){ // this is reject. } );