Pg-обещание: Пустое обещание

В настоящее время я работаю над генератором с pg-promise и Bluebird:

function * getOrRegisterCurrentFriendIfProvided(t)

это должно вернуть либо пустое обещание (если t.ctx.context не определено),
NB: пример в чистом bluebird:

yield new Promise(function (resolve) { resolve({}) });

или вызовите другую функцию (которая дает результат):

yield t.task.call(params.friend,anotherFunction);

Любой способ выразить мое пустое обещание с помощью pg-promise (без использования запроса типа t.none("BYPASS QUERY"))?

В приведенном ниже примере, когда я делаю это:

db.task(getOrRegisterCurrentFriendIfProvided)
   .then(function(result){
        console.log(result) // gives me undefined
   })

Я получил неопределенность. Я уверен, что проблема возникает, когда t.ctx.context не определен

РЕДАКТИРОВАТЬ: Полный код:

function * getOrRegisterCurrentFriendIfProvided(t) {
let params = t.ctx.context;

if (params.hasOwnProperty("friend")) {
    yield t.task.call(params.friend,anotherFunction);
} else {
    // returns a empty result ( {} )  promise , just to make promise chain not angry
    yield new Promise(function (resolve) { resolve({}) });
}

}

person jy95    schedule 27.02.2017    source источник
comment
Вам нужно добавить getOrRegisterCurrentFriendIfProvided реализацию к вашему вопросу, иначе невозможно узнать, что вы делаете и где проблема.   -  person vitaly-t    schedule 27.02.2017
comment
Только что добавил и нашел решение, но, возможно, оно не самое лучшее   -  person jy95    schedule 27.02.2017
comment
Проблема теперь очевидна — вы ничего не возвращаете в своем обратном вызове, так что же вы ожидали получить от задачи? :)   -  person vitaly-t    schedule 27.02.2017
comment
просто интересно, есть ли другой способ, чем return t.batch([]); внутри генератора?   -  person jy95    schedule 27.02.2017


Ответы (1)


Причина, по которой вы получаете undefined из задачи, заключается в том, что ваш обратный вызов ничего не возвращает. Измените его на следующее:

function * getOrRegisterCurrentFriendIfProvided(t) {
    let params = t.ctx.context;
    if (params.hasOwnProperty("friend")) {
        return yield t.task.call(params.friend, anotherFunction);
    }
}

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

ОБНОВЛЕНИЕ

pg-promise больше не поддерживает генераторы, потому что более новый NodeJS сделал синтаксис async стандартным, который больше подходит для обратных вызовов задач.

person vitaly-t    schedule 27.02.2017
comment
Спасибо. Просто нужно иметь if внутри next my next then ... Я сомневался, чтобы сделать это или заставить генератор возвращать пустое значение объекта: {} - person jy95; 27.02.2017