1

我正在尝试(如标题所示)在插件中使用 sublime text 3 的 set_timeout 函数。
据我了解,在许多情况下都需要使用 lambda 函数。所以我尝试了这个简单的测试:

class SetTimeoutTestCommand(sublime_plugin.WindowCommand):
    def run(self):
        for x in range(1,10):
            sublime.set_timeout(lambda : print(x), 4000)

所以我希望我一次打印一个数字,每个数字之间有 4 秒的延迟。如 Sublime 3 API 中所述:

在给定延迟(以毫秒为单位)后在主线程中运行回调。具有相同延迟的回调将按照添加的顺序运行。

但相反,我有 9 个 '9' 会在 4 秒后打印出来。因此,基于循环的第一次迭代,所有 '9' 都会同时打印。
你知道我能做些什么来解决这个问题吗?

提前致谢 !

编辑:我发现这是有效的(嗯,打印 '9' 9 次,每次之间有 1 秒的延迟:

class SetTimeoutTestCommand(sublime_plugin.WindowCommand):
    def run(self):
        for x in range(1,10):
            sublime.set_timeout(lambda : print(x), x*1000)

但问题仍然存在:它只打印出'9' ....

4

2 回答 2

5

要打印不同的数字,请在此更改您的插件脚本

class SetTimeoutTestCommand(sublime_plugin.WindowCommand):
    def run(self, edit):
        for x in range(1,10):
            sublime.set_timeout(lambda x=x: print(x), x*1000)

因为所有 lambda 函数都引用相同的值x,并且当它执行时,x值达到9.

于 2013-11-30T10:02:28.180 回答
2

首先要了解的是 set_timeout 调用会立即返回。也就是说,您计划在 1 秒内运行所有打印功能。相隔不到1秒。根据您的编辑,您似乎明白了这一点,但只是想我会澄清一下。

至于总是打印 9,所有打印语句都引用相同的值。因此,即使安排了第一次打印,它也会引用您要增加的相同 x 值。到打印实际运行时(1 秒后),x 的值是 9。因此,对于每个计划的回调,都会打印 9。

希望能澄清一些事情。

于 2013-11-30T09:44:48.300 回答