javascript - example - node js async lib



Implementazione dei timeout per i callback node.js (3)

Ho incontrato lo stesso problema con uno script di contenuto che tentava di aprire la porta sull'estensione BG prima che l'estensione BG fosse pronta. Una soluzione consisteva nell'attendere che l'estensione BG rispondesse a un messaggio e lo ripetesse fino al successo. Ecco i frammenti di codice.

Script di contenuto:

var nTimes     = 10;
var bIsReady = false;
checkBGReady();
function checkBGReady() {
  if (!bIsReady) {
    chrome.runtime.sendMessage({msgText: "hello "+nTimes}, function(response) {
      if (response && response.ack) {
        console.log("have response:"+response.ack+" "+nTimes);
        bIsReady = true;
        // continue with initialization
        bootStrap(sURL);
        checkReady();
      } else {
        console.log("have no ack response %o",response);
      }
    });
  }
  nTimes -= 1;
  if (nTimes > 0 && !bIsReady) {
    setTimeout(checkBGReady,100);
  }
}

Estensione BG

  chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    console.log(sender.tab ?"from a content script:" + sender.tab.url :"from the extension");
    if (request.msgText) {
      console.log("Have msg "+request.msgText);
       sendResponse({ack: "have contact "+request.msgText});
    }
  });

Nel mio caso, di solito, prendeva dopo il primo ritardo di 100 ms.

https://ffff65535.com

Questa è una situazione tipica in node.js:

asyncFunction(arguments, callback);

Al termine di asynFunction , viene callback il callback . Un problema che vedo con questo modello è che, se asyncFunction non asyncFunction mai completata (e asynFunction non ha un sistema di timeout incorporato), la callback non verrà mai chiamata. Peggio ancora, sembra che la callback non abbia modo di determinare che asynFunction non tornerà mai più.

Voglio implementare un "timeout" in cui se callback non è stato chiamato da asyncFunction entro 1 secondo, allora il callback viene automaticamente chiamato con l'assunzione che asynFunction ha errato. Qual è il modo standard per farlo?


Non ho familiarità con le librerie che lo fanno, ma non è difficile da cablare te stesso.

// Setup the timeout handler
var timeoutProtect = setTimeout(function() {

  // Clear the local timer variable, indicating the timeout has been triggered.
  timeoutProtect = null;

  // Execute the callback with an error argument.
  callback({error:'async timed out'});

}, 5000);

// Call the async function
asyncFunction(arguments, function() {

  // Proceed only if the timeout handler has not yet fired.
  if (timeoutProtect) {

    // Clear the scheduled timeout handler
    clearTimeout(timeoutProtect);

    // Run the real callback.
    callback();
  }
});

Probabilmente hai bisogno di uscire con una soluzione tutta tua. Piace

function callBackWithATimeout (callback, timeout) {
  var run, timer;
  run = function () {
    if (timer) {
      clearTimeout(timer);
      timer = null;
      callback.apply(this, arguments);
    }
  };
  timer = setTimeout(run, timeout, "timeout");
  return run;
}

e poi

asyncFunction(arguments, callBackWithATimeout(callback, 2000));




asynchronous