Обещание в функции данных MagicSuggest

Я пытался задать этот вопрос непосредственно на github, но в этом проекте, похоже, больше нет движения. Было бы здорово, если у кого-то на SO есть идея. Можно ли вернуть обещание в функции данных? Я пробовал следующее, и это не похоже на работу. Проблема в том, что я пытаюсь сделать ajax-вызов внутри функции данных, которая ожидает массив результатов / данных. Конечно, я не могу сделать это при выполнении асинхронного вызова AJAX.

var ms = $('#mycombo').magicSuggest({minChars: 2, data : function(q) {
    return someAPI.findSuggestions(q, currentLang).then(function(response) {

        if(!_.isEmpty(response.data.suggestions)) {
            _.each(response.data.suggestions, function(suggestion) {
                if (suggestion.id && suggestion.label) {
                    data.push({ id: suggestion.id, name: suggestion.label });
                }
            });
        }
    });

    return data;
}});

Если есть альтернативный способ решения этой проблемы, я был бы очень признателен за вашу помощь.

Заранее спасибо.

Майкл

2 ответа

Решение

Для тех, кому интересно, мне удалось найти решение проблемы. Как написано на github ( https://github.com/nicolasbize/magicsuggest/issues/281), вам нужно использовать событие keyup вместо установки свойства data во время инициализации. Так что теперь это выглядит примерно так:

var ms = $('#mycombo').magicSuggest({minChars: 2});

$(ms).on('keyup', function(e, m, v) {
    // ... get data via ajax and call "ms.setData(data)" in the response callback ...
    // ... you can use m.getRawValue() to get the current word being typed ...
    ms.setData(data);    
}

Это приведет к тому, что вызов ajax будет срабатывать после каждого нажатия клавиши, поэтому вы можете улучшить это, добавив некоторую задержку или что-то в этом роде.

Я также сделал это так:

const suggester: any = divElem.magicSuggest({
    ...more properties here...
    data: (query) => {
        if (query) {                    
            this.myService.mySearch(query).take(1).subscribe((list) => {
                suggester.setData(list);
            });
         }
         return [];
    },
    ...more properties here...
});

Где mySearch(запрос) возвращает:

Observable<MyObject[]>
Другие вопросы по тегам