如何调整从块内调用的回调函数的范围?

时间:2016-08-22 08:01:00

标签: javascript typescript scope

我使用第三方API,当响应回来时,需要一个名为callback_data(json)的回调函数。

但是,似乎在全球范围内调用callback_data(json)。我想将callback_data(json)函数放在一个块中,以便我可以通过promise控制流程。

我试图这样做:

return new Promise(resolve => {
            (function(callback_data) {
                api.request({"q": term});   //The third-party API call
            })(function(json) {
                resolve({...json.data, q: term})
            });
        }
    );

因此,当api.request({"q": term});行从服务器收到响应时,它将调用callback_data(json)函数。但它在全局范围内调用回调函数。我想让它从api.request()启动的块中调用。

我所做的是我认为我可以将所有内容都放入自调用函数中,并将callback_data(json)函数作为参数传递给自调用函数。我认为这会限制自调用功能块中的所有内容。不幸的是,这没有用。

如何在一个块中调用一个应该在全局范围内调用的回调函数呢?

我在代码中使用了Typescript。

1 个答案:

答案 0 :(得分:2)

如果API真正编码,则会发出:

callback_data(json);

...在您无法添加功能的范围内,您无能为力。 API设计得很糟糕(除非它是JSONP,在这种情况下可以工作的唯一方式,但它应该让你指定函数的名称)和{ {1}}必须是全球性的。

这并不意味着它必须是长寿的。您可以全局声明它:

callback_data

...然后在您的代码中,为其指定一个值并在完成后清除该值:

var callback_data = null; // At global scope

如果它是JSONP并且它允许您在请求中指定回调名称,那就更好了,因为您可以为每个请求创建不同的回调名称:

return new Promise(resolve => {
    callback_data = function() { // Assign
        callback_data = null;    // Clear on callback
        resolve({...json.data,
            q: term
        });
    };
    api.request({"q": term});
});