JS Promise в vue показывает как неопределенное - PullRequest
0 голосов
/ 17 мая 2018

У меня есть обещание, которое возвращается, когда правильное событие вызывается с правильным действием.Это то, что у меня есть до сих пор

 import {EventBus} from "./EventBus";



export function completed()  {
    EventBus.$on('queue-action', e => {
        return new Promise((resolve,reject) => {
            if(e.action == 'completed'){
                let item = e.queueItem
                resolve(item);
            }else{
                reject(new Error('No action specified in event object'))
            }

        })
    });
}



export function emitAction(action, queueItem)  {
    EventBus.$emit('queue-action', {
        action,
        queueItem
    });
}

При вызове завершенной функции в одном из моих компонентов, подобных этому

completed()
            .then((item)=> console.log('promise'))
            .catch((error) => console.log(error) );

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

То, что я пытаюсь сделать, - это позволить элементу в «очереди» отправить событие в очередь с завершенным действием, например.Затем очередь должна разрешить обещание отредактировать очередь в соответствии с назначением этого действия или отреагировать на ошибку из обещания.

Это то, что я сделал до сих пор

import {EventBus} from "./EventBus";
export class QueueEvent {
    constructor(){}
    emitAction(action, queueItem){
        return new Promise((resolve,reject) => {
            EventBus.$emit('queue-action', {
                action,
                queueItem
            },resolve,reject);
        });
    }
}
export class QueueEvents extends QueueEvent{
    constructor(){
        super();
    }

    listenForComplete() {
    }
}

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Вы хотите обернуть все EventBus.$on() в свое обещание, например:

export function completed()  {
    return new Promise((resolve) => {
        EventBus.$on('queue-action', e => {
            if(e.action == 'completed'){
                let item = e.queueItem
                resolve(item);
            }
        });
    });
}

Как правило, если у вас нет особых причин делать что-то еще, функция, возвращающая обещание, должна иметь все тело, заключенное в return new Promise(...);. Это также нормально и нормально иметь много кода, завернутого в обещание.

Примечание к коду: я удалил reject часть как для краткости, так и потому, что я не уверен, что это то, что вы хотите сделать. Если это не ошибка, если какое-либо действие произойдет до 'completed', вы должны просто игнорировать такое событие.

0 голосов
/ 17 мая 2018

Ваша завершенная функция не возвращает обещание (оно возвращает неопределенное, как вы заметили).Вы возвращаете обещание для источника событий, когда вызывается действие очереди.Здесь вы определяете новую функцию: e => {, и эта функция, которая возвращает обещание, передается в EventBus отправителю события

...