【问题标题】:Async Await Promise <Pending>异步等待承诺 <Pending>
【发布时间】: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


【解决方案1】:

变化:

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 是我会选择的选项,因为它提供了一种更简洁的书写方式。

【讨论】:

  • 但是当你往下看代码时它不会仍然是未定义的吗?
  • 很遗憾,这个 .then() 不起作用。 console.log 还是先超越功能
  • 用更新的代码再试一次?我漏掉了结果。
  • 嗨 anima,是的,它现在可以工作了.. 但是我如何将它传递给 .send?对不起,我问了很多,但这对我来说真的很困惑
  • 不客气。我已更新我的答案以反映您的更新,以便其他正在阅读本文的人更容易阅读。
【解决方案2】:

您需要在方法调用之前添加等待。 main 方法也需要异步。

var IP = 等待 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. } );

【讨论】:

    猜你喜欢
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2018-03-05
    • 1970-01-01
    • 2020-03-26
    • 2018-12-24
    相关资源
    最近更新 更多