如果抛出异常,则不会调用addEventListener

时间:2015-06-29 21:22:40

标签: javascript php jquery server-sent-events icws

我正在尝试在客户端和服务器之间实现Server-sent-events通信。

我已经实现了它,除非服务器返回异常,否则它可以正常工作。

我不确定为什么在异常之后没有将异常消息返回给客户端。

以下是我的听众的写作方式

    var evtSource = new EventSource('poll.php');

    evtSource.addEventListener("getMessagingQueue", function(e) {
        console.log(e);
        var data = JSON.parse(e.data);
        console.log(data);
        processServerData(data);

    }, false);

以下是我的PHP代码。 (即poll.php)文件

ini_set('display_errors', 0);
set_time_limit(0);

header("Content-Type: text/event-stream" . PHP_EOL);
header("Cache-Control: no-cache" . PHP_EOL);

try {

    $sleepTime = 1;
    $url = '';
    $loggedIn = false;

     if( !isDefinedConstents('ICWS_USERNAME', 'ICWS_PASSWORD', 'ICWS_STATION_NAME', 'ICWS_SERVER', 'ICWS_PORT') ){
        throw new exception('Missing Credentials');
    } else {

        $scheme = 'http';
        if(ICWS_SECURED){
            $scheme = 'https';
        }


        $url = sprintf('%s://%s:%s@%s:%s', $scheme, ICWS_USERNAME, ICWS_PASSWORD, ICWS_SERVER, ICWS_PORT);

        //configure the connection
        $conf = new ICWS\Config\Config($url, ICWS_STATION_NAME);    

        //create a new instance of icws

        $icws = new ICWS\Connection($conf); 
        $messaging = new ICWS\Messaging($icws);

        $loggedIn = $icws->isLogged();

    }

    if(!$loggedIn){
        throw new exception('Something Went Wrong when trying to login');
    }

    while($loggedIn){

        $messaging->processMessages();

        $result = array_merge( (array) $messaging->getCallsQueue(), (array) $messaging->getCurrentUserStatusQueue()) ;

        displayResults($result);

        sleep(1);

    }

} catch(Exception $e){

    $result = array('userStatus' => array('statusId' => 'You are not logged in!',
                                       'isLoggedIn' => false,
                                       'icwsDescription' => $e
                                       )
                    );

    displayResults($result);


}


function displayResults($result){

    echo 'event: getMessagingQueue' . PHP_EOL;
    echo 'data: ' . json_encode(  $result ) . PHP_EOL . PHP_EOL;
    ob_end_flush();
    flush();
}



function isDefinedConstents(){

    $args = func_get_args();

    foreach($args as $v){
        $value = constant($v);
        if( !defined($v) || empty($value) ){
            return false;
        }
    }

    return true;
}

即使存在异常,如何让侦听器获取消息?

EDITED 当我在addEventListner行

之后执行此代码时
evtSource.onerror = function(e) {
                console.log(e);
            };

这就是我得到的

error { target: EventSource, isTrusted: true, currentTarget: EventSource, eventPhase: 2, bubbles: false, cancelable: false, defaultPrevented: false, timeStamp: 1435614201283000, originalTarget: EventSource, explicitOriginalTarget: EventSource, NONE: 0 }

似乎PHP服务器抛出的异常导致整个调用失败。

2 个答案:

答案 0 :(得分:0)

最有可能的是,您的Javascript代码在返回PHP异常时遇到问题{1}因为它不是有效的JSON。这将导致您的Javascript代码中出现未捕获的异常,从而结束执行。

解决这个问题的方法是以Javascript可以处理的方式抛出异常。尝试使用JSON.parse

之类的内容,而不是抛出异常

此外,尝试使用try catch块围绕die("data: ". json_encode(array("exception" => "Missing Credentials."))),并将异常打印到控制台。

您的JSON.parse()函数中可能还会有未捕获的异常,但我们无法在不看代码的情况下知道。

答案 1 :(得分:0)

我在两条ob_end_clean();

之下添加header(....解决了这个问题