【问题标题】:How to call global function from promise function?如何从 Promise 函数调用全局函数?
【发布时间】:2018-05-23 18:20:27
【问题描述】:

执行以下功能时:

        try {
            Auction.deployed().then(function(contractInstance) {
                contractInstance.startAuction(auctionname, duration, { from: buyerAddress }).then(function(result) {
                    console.log("AUCTION HAS STARTED!!");
                    console.log(result);
                    updateAuction(result.receipt);
                });
            });
        } catch (err) {}
    }
};

updateAuction = function(data) {
    console.log("UPDATE AUCTIONS!");
....

不调用 updateAuction 函数(即使 console.log 函数正常工作并显示消息)。如何调用 updateAuction 函数?

【问题讨论】:

  • 所以你是说你得到AUCTION HAS STARTED 日志和一个result 不是空/未定义的,但不是updateAuction 的日志?并且没有收到任何其他错误消息?

标签: javascript promise


【解决方案1】:

这是因为您定义承诺和函数的顺序。

当你使用updateAuction = function () {}语法时,无论你是否使用var,你都必须在promise代码之上定义它,否则它将不可用。这与如果您要编写以下内容一样,它将无法正常工作:

var b = a;
var a = 'Hello!';

这似乎很明显,a 在定义之前将不可用。同样的事情也适用于函数:

var b = function () {
  a();
}
var a = function () {
  console.log('Hello');
}

b 函数无法访问 a,因为它尚未定义。

但是,如果您使用function updateAuction() {} 的定义,它将被提升,这意味着它是在其他任何东西之前定义的。

关于吊装如何工作的文章很多,例如this one from scotch.io和this from Mozilla

【讨论】:

  • vars 也被提升了,并且由于 Promise 会在其他所有操作之后执行,因此您可以放心,该函数已被定义。
  • 鉴于then 回调始终是异步的,因此该变量将具有在调用时分配的函数。
  • 在您的第二次 sn-p 中,只要您在分配 a = … 之后调用 b(),一切都很好。
  • 嗯....是的,也许我错了。我不会想到他们会被吊起来。但我想象它在定义/在同一范围内之后不会被调用。 Tbh,如果没有问题中的完整代码,很难真正知道。
  • 这有点灾难。现在 OP 接受了一个不正确的答案,因为它没有足够早地被删除。
【解决方案2】:
var updateAuction = function(data) {
    console.log("UPDATE AUCTIONS!");
    ...
}

try {
            Auction.deployed().then(function(contractInstance) {
                contractInstance.startAuction(auctionname, duration, { from: buyerAddress }).then(function(result) {
                    console.log("AUCTION HAS STARTED!!");
                    console.log(result);
                    updateAuction(result.receipt);
                });
            });
        } catch (err) {}

【讨论】:

  • 请edit您的原始答案,而不是发布内容基本相同的多个答案。
【解决方案3】:

你必须在尝试之前定义你的函数。像这样更正它

var updateAuction = function(data) {
    console.log("UPDATE AUCTIONS!");
    ...
}

try {
            Auction.deployed().then(function(contractInstance) {
                contractInstance.startAuction(auctionname, duration, { from: buyerAddress }).then(function(result) {
                    console.log("AUCTION HAS STARTED!!");
                    console.log(result);
                    updateAuction(result.receipt);
                });
            });
        } catch (err) {}
    ;

【讨论】:

  • 那些大括号不匹配。
  • 是的。对不起,我刚刚复制了它的代码。最后一个大括号必须去掉
  • 预先定义函数没有任何区别,因为then 回调是异步的,并且vars 被提升以便它们在范围内。
  • @layekams 那些不匹配的大括号表明,在 OPs 代码中,该函数也在另一个函数中被调用。
  • @bergi,是的,这是最后两个大括号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
相关资源
最近更新 更多