Как преобразовать обещание в наблюдаемое?

Я работаю над проектом ionic 2. Я могу вернуть все контакты в устройстве/телефоне. Но я использовал код обещания, который имеет очень низкую производительность из-за одного запроса за раз. Теперь я хочу изменить этот код обещания на наблюдаемый. Пожалуйста, помогите мне решить эту проблему.

findContact(searchKey){
    if(searchKey.target.value == "" || searchKey.target.value == undefined || searchKey.target.value == null){
        this.contactSelected = false;
    } else{
        this.contactSelected = true;
    }
    let options = {
        multiple: true,
        hasPhoneNumber: true,
        filter: searchKey.target.value
    }
    let cantactFields = ['displayName', 'phoneNumbers'];
    Contacts.find(cantactFields, options).then(res => {
            this.contactResults = res;
    }, (er) => {
        console.log(er);
    })
}

Contacts.find() — это метод, в котором я использовал промисы. И этот метод возвращает контакты очень медленно.


person Mr_Perfect    schedule 21.11.2016    source источник
comment
Вероятно, у вас проблема с XY, если метод «медленный», то наблюдаемые ничем не могут помочь. И промисы, и наблюдаемые могут обрабатывать несколько запросов одновременно. И вопрос не показывает соответствующий код.   -  person Estus Flask    schedule 21.11.2016


Ответы (1)


Вы можете использовать Observable.fromPromise, чтобы обернуть свое обещание наблюдаемым.

Что-то подобное можно сделать, чтобы обернуть ваше обещание наблюдаемым.

findContact(searchKey){
    if(searchKey.target.value == "" || searchKey.target.value == undefined || searchKey.target.value == null){
        this.contactSelected = false;
    } else{
        this.contactSelected = true;
    }
    let options = {
        multiple: true,
        hasPhoneNumber: true,
        filter: searchKey.target.value
    }
    let cantactFields = ['displayName', 'phoneNumbers'];
    var promise =Contacts.find(cantactFields, options).then(res => {
        this.contactResults = res;
    }, (er) => {
        console.log(er);
    })
    return PromiseObservable.create(promise); //     Observable.fromPromise(promise)
}

Надеюсь это поможет

person Bhushan Gadekar    schedule 21.11.2016
comment
Я думаю, что это также даст тот же результат. Потому что вы отправляете запрос по обещанию. Затем вы возвращаете ответ в наблюдаемый. Я прав? - person Mr_Perfect; 21.11.2016
comment
Да. Это разрешит обещание, а затем преобразует его в наблюдаемое. если вы хотите использовать наблюдаемые, вам придется обновить API в сервисе. - person Bhushan Gadekar; 21.11.2016
comment
Но это предопределенный метод. ionicframework.com/docs/v2/native/contacts см. эту ссылку об этом методе . Если у вас есть другие мысли, пожалуйста, поделитесь со мной. - person Mr_Perfect; 21.11.2016