Функция применить с обещаниями


Я работаю над проектом, основанным на обещаниях, в Node.Яш, используя "Синей птицы" , и еще в родной обещания ЕС6. В обоих случаях у меня есть цепочка, в которой я запрашиваю базу данных в следующем виде:

some_function(/*...*/)

    .then(function () {
        return query("SELECT `whatever` FROM `wherever` ")
    })

    .then(/*...*/)

Обратите внимание, что query, очевидно, возвращает обещание, разрешенное в результате запроса. Это повторяется в нескольких цепочках, и я ищу способ очистить неиспользуемую обертку функции.

Я бы, естественно, использовал Function.prototype.apply(), но в этом случае, когда я пытаюсь:

.then(query.apply(this, ["SELECT * FROM ... "]))
.then(function(rows){ /*...*/ })

Следующий функция в цепочке получает rows как undefined.

Спасибо заранее. Мы ценим вашу помощь.

2 5

2 ответа:

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

  1. используйте встроенную анонимную функцию, как вы есть.
  2. создайте свою собственную функцию полезности, которая возвращает другую функцию (см. пример ниже)
  3. используйте .bind() для создания другой функции.

Встроенный аноним

some_function(/*...*/).then(function () {
    return query.apply("SELECT `whatever` FROM `wherever` ")
}).then(/*...*/)

Ваша собственная оболочка функций

function queryWrap(q) {
    return function() {
        return query.apply(q);
    }
}

some_function(/*...*/)
  .then(queryWrap("SELECT `whatever` FROM `wherever` "))
  .then(/*...*/)
Эта обертка может быть полезна, если вы можете использовать ее в нескольких местах. Скорее всего нет стоит только одного призыва.

Использовать .связать()

some_function(/*...*/)
  .then(query.apply.bind(query, "SELECT `whatever` FROM `wherever` "))
  .then(/*...*/)

В es6 функции со стрелками решают это лучше всего:

.then(() => query.apply("SELECT `whatever` FROM `wherever` "))
.then(rows => { /*...*/ })