我正在尝试使用javascript绑定函数将我需要的文件传递到作用域,并让它使用该对象的功能来执行某些代码。
这是一个递归函数,所以简单地说,我有一个对象:
var tts = require('./tts')
此对象使用Web API的语音合成功能将传入的文本转换为语音。
所以,我有一个递归函数,比如说,在完成第一个函数之后应该说下一件事。
function saySomething(idx) {
tts('first thing',saysomething.bind(this,'next thing'))
}
不幸的是,这不起作用。
谁能告诉我我做错了什么?
我的代码:
P.S。我正在使用browserify将节点式代码编译成浏览器友好的代码
答案 0 :(得分:1)
假设tts()
是一个异步函数,在它完成后调用它的回调函数,你可以在这样做时调用下一个函数:
function saySomething(idx) {
tts('first thing', function() {
tts('next thing');
})
}
这会说first thing
然后说next thing
然后完成。虽然乍一看,这似乎是递归的,但是由于回调的异步性质,它不会像常规递归调用一样累积堆栈帧。第一次调用tts()
实际上已在第二次调用之前返回。
如果您真正想做的是迭代一系列事情要说,你可以这样做:
var phrases = ["one", "two", "three", "four"];
function sayPhrases(items) {
var index = 0;
function next() {
if (index < items.length) {
tts(items[index++], next);
}
}
next();
}
sayPhrases(phrases);