Подтвердить что ты не робот

Правильный способ привязки объекта к аргументу Promise.then()

Я обнаружил, что трудно просто передать объектную функцию в Bluebird then. Я предполагаю, что Bluebird then выполняет некоторую магию и завершает переданную функцию в анонимной функции. Поэтому я привязал функцию .bind к функции, и она сработала. Это правильный способ сделать это с помощью bluebird? Или есть лучший способ?

var Promise = require("bluebird")

var Chair = function(){
  this.color = "red"
  return this
}


Chair.prototype.build = function(wood){
  return this.color + " " + wood
}

var chair = new Chair()

//var x = chair.build("cherry")

Promise.resolve("cherry")
  .then(chair.build.bind(chair)) // color is undefined without bind
  .then(console.log)

Я знаю, что это не асинхронно, поэтому, пожалуйста, приготовьтесь к примеру синхронизации, мое использование будет асинхронным.

4b9b3361

Ответ 1

Итак, я привязал a .bind к функции, и она сработала. Это правильный способ сделать это с помощью bluebird?

Да, это один из способов сохранить контекст. Вы также можете передать анонимную функцию (возможно, вы уже знаете это).

Promise.resolve("cherry")
    .then(function (value) {
        return chair.build(value);
    })
    .then(console.log);

Или есть лучший способ?

Фактически вы можете использовать метод bluebird Promise.bind, например

Promise.resolve("cherry")
  .bind(chair)
  .then(chair.build)
  .then(console.log)

Теперь, когда вызываются обработчики Promise (выполняют обработчики или обработчики отклонения), внутри функции this будет ссылаться только на объект chair.


Примечание 1: В этом конкретном случае console.log также получает this как chair объект, но он все равно отлично работает, потому что в Node.js, Функция console.log определяется не только на прототипе bu также на самом объекте, связанном с объектом console. Соответствующий код здесь.

Примечание 2: Если разные обработчики нуждаются в разных контекстах, лучше писать анонимные функции. В этом случае Promise.bind не поможет. Но если вы решите использовать его, вам придется использовать разные контексты для каждого из обработчиков, и ваш код может выглядеть примерно так.

var chair1 = new Chair("red")
var chair2 = new Chair("green")

Promise.resolve("cherry")
    .bind(chair1)            // Changing the binding to `chair1`
    .then(chair1.build)
    .tap(console.log)
    .bind(chair2)            // Changing the binding to `chair2`
    .then(chair2.build)
    .tap(console.log);

суб >