javascript - Using setImmediate for API consideration -


that's general question using setimmediate (or similar solutions) api purpose. i'm writing node.js library performs negotiation server behind scene. client code of library seems that:

var request = mylib     .createrequest()     .setrequestproperty('someproperty', somevalue)     .setanotherrequestproperty('anotherproperty', anothervalue)     .performrequest(function callback() {          var somevalue = request.somevalue;          var requestresult = request.result;          // logic based on requestresult , somevalue     }); 

the problem begins when library not need perform or wait negotiation server, may call callback passed performrequest immediately. internal library code may seems like:

request.prototype.performrequest = function performrequest(callback) {     if (this._canperformimmediately()) {         callback();         return this;     }      this._performserverrequest().then(callback);     return this; }; 

what happens request still undefined (as call callback done before external statement contains request assignment finished).

i wonder correct way define api in such cases. see possibilities:

  1. define callback may called synchronously (as described above), , client code may not use request variable in above client code example. i've seen code seems above, guess not solution.
  2. define callback may called synchronously, , request passed callback client code may (notice use of request_ instead of request):

    .performrequest(function callback(request_) {     var somevalue = request_.somevalue;     var someresult = request_.result;     // logic based on requestresult , somevalue } 

    (edit: request may passed this argument).

    but again, i've seen code seems first example, guess not solution.

  3. guarantee callback called asynchronously. can use setimmediate functions. internal implementation (notice setimmediate call):

    request.prototype.performrequest = function performrequest(callback) {     if (this._canperformimmediately()) {         setimmediate(callback);         return this;     }      this._performserverrequest().then(callback);     return this; }; 
  4. any other suggestions?

it seems setimmediate alternative attractive, failed find discussion using api consideration only. i've seen discussions performance such here , here, no api considerations.

so question is: correct way implement such library?


Comments