使用node.js + Q延迟/承诺模块从同步callback中​​创build同步循环

stream行的JavaScript模块Q实现了延期/承诺/期货概念。 我认为它主要与node.js一起使用,但它也支持浏览器。 我使用node.js。

要做顺序调用,你使用then()把一个承诺链接到下一个,但是在一个循环中,它可能是违反直觉的,而我发现很难像这个伪代码那样做:

 forever { l = getline(); if (l === undefined) { break; } else { doStuff(l); } } 

Q文档包括一个看起来非常相似的例子:

 var funcs = [foo, bar, baz, qux]; var result = Q.resolve(initialVal); funcs.forEach(function (f) { result = result.then(f); }); return result; 

但是,在尝试很多方法来适应这个例子,我没有成功。

与示例代码不同,我不是遍历数组,而是希望循环直到满足结束条件。 另外我总是调用相同的function。 我的函数不会将之前的结果作为下一个调用的参数。 每个调用不需要参数,但返回值决定是否继续循环。

这些看似微不足道的差异正在造成某种无法克服的心理障碍。 现在我明白了为什么许多人对理解承诺有困难。

关键要记住的是,如果你从callback中返回一个承诺,那么它将取代现有的承诺。 这个想法是,在循环体中执行一个你想要做的事情链的一个迭代之后,你要么返回一个值,这将解决承诺,或者你返回一个新的承诺,将再次执行循环的主体。

 function iterateUntil(endValue){ // This line would eventually resolve the promise with something matching // the final ending condition. return Q.resolve('some value') .then(function(value){ // If the promise was resolved with the loop end condition then you just // return the value or something, which will resolve the promise. if (value == endValue) return value; // Otherwise you call 'iterateUntil' again which will replace the current // promise with a new one that will do another iteration. else return iterateUntil(endValue); }); } 

这不是Q: 同步for循环 。