Async Await Promise <pending>

时间:2018-03-25 08:11:40

标签: node.js asynchronous

我知道这个问题已被多次询问,但由于我还很新,所以我不太了解以前的地方的答案。

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}`);
});

2 个答案:

答案 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. } );