我使用第三方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。
答案 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});
});