这是关于使用setImmediate(或其他类似解决方案)进行API目的的一般性问题。我正在编写一个node.js库,它与场景后面的服务器进行协商。这个库的客户端代码如下所示:
var request = myLib
.createRequest()
.setRequestProperty('someProperty', someValue)
.setAnotherRequestProperty('anotherProperty', anotherValue)
.performRequest(function callback() {
var someValue = request.someValue;
var requestResult = request.result;
// Some logic based on requestResult and someValue
});
问题开始于我的库不需要执行或等待与服务器的任何协商,因此可以立即调用传递给performRequest
的回调。然后内部库代码可能如下:
Request.prototype.performRequest = function performRequest(callback) {
if (this._canPerformImmediately()) {
callback();
return this;
}
this._performServerRequest().then(callback);
return this;
};
然后发生的是请求仍未定义(因为在外部语句包含请求分配完成之前完成对回调的调用)。
我想知道在这种情况下定义API的正确方法是什么。我看到了一些可能性:
request
变量。但是,我已经看到了一些如上所示的代码,所以我想这不是解决方案。定义可以同步调用回调,并且请求也会传递给回调,因此客户端代码可能是(注意使用request_
代替request
):
.performRequest(function callback(request_) {
var someValue = request_.someValue;
var someResult = request_.result;
// Some logic based on requestResult and someValue
}
(编辑:请求也可以作为this
参数传递。)
但是,我再次看到一些代码似乎是第一个例子,我想这也不是解决方案。
保证回调被称为ASYNCHRONOUSLY。然后我们可以使用setImmediate函数。然后内部实现将如下所示(注意setImmediate
调用):
Request.prototype.performRequest = function performRequest(callback) {
if (this._canPerformImmediately()) {
setImmediate(callback);
return this;
}
this._performServerRequest().then(callback);
return this;
};
还有其他建议吗?
似乎setImmediate备选方案最具吸引力,但我没有找到关于仅将其用于API考虑的讨论。我已经看过有关性能的讨论,例如here和here,但没有考虑API。
所以我的问题是:实现这样的库的正确方法是什么?