2016-03-30 2 views
0

Я создал вспомогательный помощник {{findby}}, который очень полезен для выбора элемента из массива, но я столкнулся с проблемой. Помощнику не нравится называть findBy() массивом, который является обещанием.EmberJS: Как сделать помощника, который может возвращать данные из обещания

Так помощник был изменен, чтобы сделать это:

export function findby([array, key, value]) { 
    let isPromiseArray = Ember.typeOf(array.then) === 'function'; 
    if (isPromiseArray) { 
    array.then((arr) => { 
     return arr.findBy(key, value) || null; 
    }); 
    } else { 
    return array.findBy(key, value) || null; 
    } 
} 

export default Ember.Helper.helper(findby); 

Идея заключалась в том, конечно, если передается массив случается быть PromiseArray, используйте then(), прежде чем пытаться вызвать findBy().

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

Если я пытаюсь сделать:

return array.then((arr) => { 
    return arr.findBy(key, value) || null; 
}); 

тогда только само обещание получает вернулся из помощника.

Вот Twiddle того, что я пытался: https://ember-twiddle.com/c82fb0e11641703f118e867b45403654?numColumns=2&openFiles=controllers.application.js%2Chelpers.findby.js

на вопрос, как представляется, вообще один для помощников: Есть ли способ, чтобы вернуть данные обещания затем функцию /() в качестве помощника? Интересно, возможно ли, что я хочу сделать, с помощником?

+2

Вы должны проверить [ember-prom-helpers] (https://github.com/fivetanley/ember-promise-helpers) – nem035

+0

@nem ok спасибо, это похоже, что это может быть полезно! – Grapho

ответ

0

Я думаю, вам просто нужно позвонить recompute!

Так что-то вроде этого:

function findBy([array, key, value]) { 
    let content = Ember.get(array, 'content'); 

    if(!content) { 
     array.then(() => this.recompute()); 
     return null; 
    } 

    return content.findBy(key, value) || null; 
} 

Что вы пробовали не возможно. Если вы напишете return .then(() => <here>);, вы вернете функцию стрелки, а не родительскую функцию. Родительская функция возвращалась задолго до и хорошо, она даже не дождалась обещаний.

Но вы всегда можете позвонить по телефону .recompute, чтобы хорошо переплатить, и это сработает для вас.

+0

, что выглядит неплохо. Я видел код, похожий на тот, который смотрит на аддон-помощник-помощник .. но .. могу ли я назвать «recompute» на обычной вспомогательной функции? или он должен быть помощником класса? – Grapho

+0

Я не уверен на 100%, но я думаю, что данные ember обертывают вашу функцию в вспомогательном экземпляре. Так что это должно сработать. Но попробуйте. – Lux

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