0

Here is most of my background.js code

var DataProcessor;

DataProcessor = (function() { DataProcessor.prototype.coursesHolder = {};

function DataProcessor() {
  chrome.runtime.onMessage.addListener((function(_this) {
    return function(request, sender, sendResponse) {
      var _base, _name;
      if (request) {
        console.log(request);
        switch (request.type) {
          case "showPageAction":
            (_base = _this.coursesHolder)[_name = request.courseName] || (_base[_name] = {
              courseName: request.courseName,
              courseTitle: request.courseTitle
            });
            chrome.pageAction.show(sender.tab.id);
            break;
          case "getCourse":
            sendResponse(_this.coursesHolder[request.courseName]);
            break;
          case "getAdditional":
            chrome.storage.local.get(request.courseName, function(datum) {
              return sendResponse({
                additional: datum[request.courseName].points.additional
              });
            });
            break;
          case "storeAdditional":
            _this.storeAdditional(request.additional, request.courseName);
            break;
          case "removeAdditional":
            _this.removeAdditional(request.index, request.courseName);
            break;
          case "updateCalculated":
            _this.updateCalculated(request.data, request.pointsType, request.courseName);
            break;
          case "calculatePoints":
            sendResponse(_this.calculatePoints(request.courseName));
            break;
          default:
            return sendResponse({
              error: 'Unidentified Exception'
            });
        }
      }
    };
  })(this));
}

It is the part which causes error. Actually, It is compiled from coffee script code. The tricky part is about getAdditional branch of the flow. if I would have sendResponse before the storage access – it works as expected. Storage itself returns results predicted. But in combination – sendResponse inside callback to storage.get – nothing happens at all. No errors, just like sendResponse is not called at all!

Coffee Script sources:

class DataProcessor
  coursesHolder: {}

  constructor: ->
    chrome.runtime.onMessage.addListener (request, sender, sendResponse) =>
      if request
        console.log request
        switch request.type
          when "showPageAction"
            @coursesHolder[request.courseName] ||=
              courseName: request.courseName
              courseTitle: request.courseTitle
            chrome.pageAction.show(sender.tab.id)
            break
          when "getCourse"
            sendResponse @coursesHolder[request.courseName]
            break
          when "getAdditional"
            chrome.storage.local.get request.courseName, (datum) =>
              sendResponse
                additional: datum[request.courseName].points.additional
            break
          when "storeAdditional"
            @storeAdditional(request.additional, request.courseName)
            break
          when "removeAdditional"
            @removeAdditional(request.index, request.courseName)
            break
          when "updateCalculated"
            @updateCalculated(request.data, request.pointsType, request.courseName)
            break
          when "calculatePoints"
            sendResponse @calculatePoints(request.courseName)
            break
          else
            sendResponse
              error: 'Unidentified Exception'

The message is sent as following:

    chrome.runtime.sendMessage
      type: "getAdditional"
      courseName: @courseName
    , (response) =>
      console.log response
      if response.additional

If anyone have any idea on how to get this callback stack work as expected, please help.

Vlad Bogomolov
  • 348
  • 4
  • 14
  • 2
    To clarify, that question has exactly the same root cause, and the answer quotes the relevant docs. You just need to `return true` from that branch to indicate that you'll use `sendResponse` asynchronously. – Xan Aug 14 '14 at 09:46
  • @Xan thanks a lot! I really should have noticed that part of documentation. You saved me a bunch of hours! – Vlad Bogomolov Aug 14 '14 at 10:14

0 Answers0