使用回调一旦可用就传递消息

时间:2015-02-27 20:41:13

标签: javascript

我会承认的。回调的想法对我来说没有任何意义。我正在尝试为我的程序实现一个,因为我的变量在函数内部修改后保持不变。

function getMessage(callback) {
        setTimeout(function() {callback(setupAddress(ownerPickupAddressItem));
    }, 0);
}

getMessage(function(ownerPickupAddressItem) {
    console.log(ownerPickupAddressItem);
});

function setupAddress(ownerPickupAddressItem) {
    ownerPickupAddressItem = $('.timeline-item.active-item > .timeline-status > .pickup-address').text();
}

我已对上述内容进行了测试,ownerPickupAddressItem仍为undefined。知道为什么吗?

2 个答案:

答案 0 :(得分:2)

undefined,因为您将setupAddress的结果传递给了回调。 setupAddress不会返回任何内容,因此它是undefined。而是从setupAddress

返回值
function getMessage(callback) {
        setTimeout(function() {callback(setupAddress(ownerPickupAddressItem));
    }, 0);
}

getMessage(function(ownerPickupAddressItem) {
    console.log(ownerPickupAddressItem);
});

function setupAddress(ownerPickupAddressItem, ownerDropoffAddressItem, waypointsArrayItem) {
    return $('.timeline-item.active-item > .timeline-status > .pickup-address').text();
}

但请注意,您实际上并没有以有意义的方式将任何参数传递给setupAddress函数 - 它们都是undefined

让我们简化一点:

//Fire the callback after 1 second with some text
function getMessage(callback) {
    setTimeout(function() {
        callback("Hello world!");
    }, 1000);
}

getMessage(function(message) {
    console.log(message);
});

这会调用getMessage并使用一个旨在获取单个参数的回调。 getMessage函数等待1秒,然后触发回调。

答案 1 :(得分:0)

您可能想要做这样的事情

var self = this;
function getMessage(callback) {
        /* 
           assuming you have 
           ownerPickupAddressItem, ownerDropoffAddressItem, waypointsArrayItem 
           defined somewhere on self
        */ 
        setTimeout(function() {
            callback.call( self, self.ownerPickupAddressItem,
                                self.ownerDropoffAddressItem,
                                self.waypointsArrayItem      );
        }, 0);
}

基本上会传递函数,当调用回调时会使用当时的args

您未定义的原因是因为

function getMessage(callback) {
    setTimeout(function() {
        //you are calling setupAddress and passing it to the callback
        //setupAddress returns nothing, so it will be undefined
        callback(setupAddress(ownerPickupAddressItem));
    }, 0);
}

另请查看 mozilla docs for call apply ,了解如何设置回调的执行上下文