На каком уровне нормализуется эта схема?

Принятый ответ правильный, я просто хотел добавить пример кода, который упростит это. Проблема в том, что API (на мой взгляд) не очень хорошо разработан, потому что он заставляет нас разработчиков знать, обрабатывается ли какое-либо конкретное сообщение async или нет. Если вы обрабатываете много разных сообщений, это становится невыполнимой задачей, потому что вы никогда не знаете, если в какой-то степени в какой-то функции переданный метод sendResponse будет вызываться как асинхронный или нет. Рассмотрим это:

chrome.extension.onMessage.addListener(function (request, sender, sendResponseParam) {
if (request.method == "method1") {
    handleMethod1(sendResponse);
}

Как узнать, будет ли в самом низу handleMethod1 вызов асинхронным или нет? Как может кто-то, кто изменяет handleMethod1, знает, что он сломает вызывающего абонента, введя что-то async?

Мое решение таково:

chrome.extension.onMessage.addListener(function (request, sender, sendResponseParam) {

var responseStatus = { bCalled: false };

function sendResponse(obj) {  //dummy wrapper to deal with exceptions and detect async
    try {
        sendResponseParam(obj);
    } catch (e) {
        //error handling
    }
    responseStatus.bCalled= true;
}

if (request.method == "method1") {
    handleMethod1(sendResponse);
}
else if (request.method == "method2") {
    handleMethod2(sendResponse);
}
...

if (!responseStatus.bCalled) { //if its set, the call wasn't async, else it is.
    return true;
}

});

Это автоматически обрабатывает возвращаемое значение, независимо как вы решаете обработать сообщение. Обратите внимание, что это предполагает, что вы никогда не забудете вызвать функцию ответа. Также обратите внимание, что хром мог автоматизировать это для нас, я не понимаю, почему они этого не сделали.

0
задан nicomp 30 December 2018 в 19:50
поделиться