我如何传递上下文到setTimeout?如果this.options.destroyOnHide在1000毫秒后,我想调用this.tip.destroy()。我该怎么做呢?
if (this.options.destroyOnHide) {
setTimeout(function() { this.tip.destroy() }, 1000);
}
当我尝试上面的时候,这指的是窗口。
我如何传递上下文到setTimeout?如果this.options.destroyOnHide在1000毫秒后,我想调用this.tip.destroy()。我该怎么做呢?
if (this.options.destroyOnHide) {
setTimeout(function() { this.tip.destroy() }, 1000);
}
当我尝试上面的时候,这指的是窗口。
我正在升级一些旧的TypeScript代码以使用最新的编译器版本,我在调用setTimeout时有麻烦。代码期望调用浏览器的setTimeout函数,该函数返回一个数字:
setTimeout(处理程序:(…Args: any[]) => void, timeout: number): number;
但是,编译器将此解析为节点实现,该实现将返回NodeJS。定时器:
setTimeout(回调:(…Args: any[]) => void, ms: number,…args: any[]): NodeJS.Timer;
这段代码没有在节点中运行,但是节点类型被拉入作为对其他东西的依赖(不确定是什么)。
如何指示编译器选择我想要的setTimeout版本?
下面是问题代码:
let n: number;
n = setTimeout(function () { /* snip */ }, 500);
这将产生编译器错误:TS2322:类型'Timer'不能分配给类型'number'。
我正在尝试使用新的异步特性,我希望解决我的问题能够在未来帮助到其他人。这是我正在工作的代码:
async function asyncGenerator() {
// other code
while (goOn) {
// other code
var fileList = await listFiles(nextPageToken);
var parents = await requestParents(fileList);
// other code
}
// other code
}
function listFiles(token) {
return gapi.client.drive.files.list({
'maxResults': sizeResults,
'pageToken': token,
'q': query
});
}
问题是,我的while循环运行得太快,脚本每秒向谷歌API发送太多请求。因此,我想建立一个睡眠函数延迟请求。因此,我还可以使用这个函数来延迟其他请求。如果有其他方法可以延迟请求,请让我知道。
不管怎样,这是我的新代码,它不能工作。请求的响应被返回到setTimeout内的匿名异步函数,但我只是不知道如何将响应返回到睡眠函数resp。初始asyncGenerator函数。
async function asyncGenerator() {
// other code
while (goOn) {
// other code
var fileList = await sleep(listFiles, nextPageToken);
var parents = await requestParents(fileList);
// other code
}
// other code
}
function listFiles(token) {
return gapi.client.drive.files.list({
'maxResults': sizeResults,
'pageToken': token,
'q': query
});
}
async function sleep(fn, par) {
return await setTimeout(async function() {
await fn(par);
}, 3000, fn, par);
}
我已经尝试了一些选项:将响应存储在全局变量中并从sleep函数中返回,匿名函数中的回调等。
我有一些JavaScript代码,看起来像:
function statechangedPostQuestion()
{
//alert("statechangedPostQuestion");
if (xmlhttp.readyState==4)
{
var topicId = xmlhttp.responseText;
setTimeout("postinsql(topicId)",4000);
}
}
function postinsql(topicId)
{
//alert(topicId);
}
我得到一个错误,topicId没有定义 在我使用setTimeout()函数之前,一切都在工作。
我希望我的postinsql(topicId)函数在一段时间后被调用。 我该怎么办?