使用setImmediate进行API考虑

时间:2015-07-10 09:06:13

标签: javascript node.js api asynchronous eventemitter

这是关于使用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的正确方法是什么。我看到了一些可能性:

  1. 定义可以同步调用回调(如上所述),因此客户端代码可能不会像上面的客户端代码示例中那样使用request变量。但是,我已经看到了一些如上所示的代码,所以我想这不是解决方案。
  2. 定义可以同步调用回调,并且请求也会传递给回调,因此客户端代码可能是(注意使用request_代替request):

    .performRequest(function callback(request_) {
        var someValue = request_.someValue;
        var someResult = request_.result;
        // Some logic based on requestResult and someValue
    }
    

    编辑:请求也可以作为this参数传递。)

    但是,我再次看到一些代码似乎是第一个例子,我想这也不是解决方案。

  3. 保证回调被称为ASYNCHRONOUSLY。然后我们可以使用setImmediate函数。然后内部实现将如下所示(注意setImmediate调用):

    Request.prototype.performRequest = function performRequest(callback) {
        if (this._canPerformImmediately()) {
            setImmediate(callback);
            return this;
        }
    
        this._performServerRequest().then(callback);
        return this;
    };
    
  4. 还有其他建议吗?

  5. 似乎setImmediate备选方案最具吸引力,但我没有找到关于仅将其用于API考虑的讨论。我已经看过有关性能的讨论,例如herehere,但没有考虑API。

    所以我的问题是:实现这样的库的正确方法是什么?

0 个答案:

没有答案