Apidevise为一个不安全的asynchronous函数

我读过这是不好的做法混合function中的同步和asynchronous操作(例如http://nodejs.org/api/process.html#process_process_nexttick_callback )。

现在我想要迭代我想要保存在数据库中的文档数组。 保存之前,我需要逐步validation所有文件。 一个特定的validation器可以在api后面创build。

validation函数可以是完全同步的(简单的检查字段,如果它们是doc.sum> 10有效的),但也是asynchronous的(如果我需要获取和validation依赖文档)。

与asynchronous库( https://github.com/caolan/async )我有这样的事情:

function validateAll(docs) { async.eachSeries(docs, function (doc, callback) { var async = false; validate(doc, function () { if (async) { callback(); } else { process.nextTick(function () { callback(); }); } }); async = true; }); } function validate(doc, callback) { if (doc.sum < 10) { return callback(new Error("Invalid sum")); } if (doc.otherDocumentId) { validateOtherDocFromDbAsync(doc.otherDocumentId, callback); // collection.find() or something } else { callback(); } } 

在这个例子中,我设置了迭代callback的下一个滴答,以避免“最大调用堆栈大小超过错误”,如果许多callback被同步调用。

我也想过创buildvalidateSync和validateAsync函数来精确定义它们的function。

这是不好的做法? 你将如何devise这个例子的API?

Solutions Collecting From Web of "Apidevise为一个不安全的asynchronous函数"

这是不好的做法?

是。 http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony

你将如何devise这个例子的API?

而不是传递一个callback来validate它是否被asynchronous调用,你应该使validate函数始终是asynchronous的

 function validateAll(docs) { async.eachSeries(docs, validate); } function validate(doc, callback) { if (doc.sum < 10) { process.nextTick(function () { callback(new Error("Invalid sum")); }); } else if (doc.otherDocumentId) { validateOtherDocFromDbAsync(doc.otherDocumentId, callback); // collection.find() or something } else { process.nextTick(callback); } }