Функция применить с обещаниями
Я работаю над проектом, основанным на обещаниях, в 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 ответа:
Вы должны передать ссылку на функцию
.then()
, поэтому ваш выбор выглядит следующим образом:
- используйте встроенную анонимную функцию, как вы есть.
- создайте свою собственную функцию полезности, которая возвращает другую функцию (см. пример ниже)
- используйте
.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(/*...*/)