2016-11-15 3 views
0

У меня есть следующий кодУгловые 2 возвращаемые данные из функции стрелки

getEnquiryWithId(id: number) { 
    let enquiryStore = this.db.transaction('enquiries', 'readonly').objectStore('enquiries'); 
    let index = enquiryStore.index('enquiries'); 
    let request = index.get(id); 
    return request.onsuccess = (event) => { 
     return event.target.result; 
    } 
    } 

, который я пытаюсь использовать в трубе

transform(value: number): string { 
    let request = this.dbStore.getEnquiryWithId(value); 
    let result = request(); 
    } 

Я получаю сообщение об ошибке сказав Cannot invoke an expression whose type lacks a call signature.

Примечание: я не могу полагаться на объекты RxJs здесь, так как моя функция преобразования должна что-то возвращать, как ее труба. Как это сделать?

+1

Что вы ожидаете от 'request()' делать? 'getEnquiryWithId' не возвращает ничего, что вы могли бы назвать. Вы можете, например, make 'getEnquiryWithId' return a Observable, что труба может затем' .map' и использовать дополнительный '| async', чтобы решить эту проблему. – jonrsharpe

+0

Я хочу, чтобы 'event.target.result' был доступен в' transform' –

+0

Я понимаю это, но неясно, почему вы считали, что вызов 'request()' будет делать это. Вы должны сделать это асинхронно - канал * может * вернуть наблюдаемый, вы просто положили, например. 'startPoint | myPipe | async' в шаблоне, чтобы решить эту проблему. Но 'getEnquiryWithId' должен будет вернуть наблюдаемое, или что-то, что вы можете превратить в одно. Сообщение об ошибке связано с тем, что оно ничего не возвращает, но вы все еще пытаетесь вызвать то, что оно возвращает. – jonrsharpe

ответ

0

Название вводит в заблуждение. Вы не хотите, чтобы данные возвращались из функции стрелок (что тривиально возможно), но вы хотите, чтобы ваша функция стрелок выполнялась синхронно, что невозможно, поскольку это обратный вызов, который будет вызываться механизмом JS.

Как другие упомянули вы можете вернуть обещание в функции, которая сопоставляет как только внутренний запрос успешно:

getEnquiryWithId(id: number) { 
    let enquiryStore = this.db.transaction('enquiries', 'readonly').objectStore('enquiries'); 
    let index = enquiryStore.index('enquiries'); 
    let request = index.get(id); 
    return new Promise((resolve, reject) => { 
    request.onsuccess = (event) => { 
     resolve(event.target.result); 
    }; 
    request.onerror = (event) => { 
     reject(request.errorCode); 
    }; 
    } 
} 

Если вы хотите отобразить результат обещания вы могли бы просто использовать AsyncPipe. Нет необходимости писать собственную функцию преобразования.

+0

Или наблюдаемый – Amit

Смежные вопросы