Обещания, аргумент в .then () не определен, как пройти? - PullRequest
0 голосов
/ 05 июля 2018

Я использую это руководство для запуска некоторых родительских функций внутри Обещания. Это пример React, я использую Vue.js.

Моя проблема в том, что, хотя я строю Обещание точно так же, как в примере, я все еще сталкиваюсь с проблемой actions undefined.

А именно, аргумент actions не определен внутри метода (.then()), который может быть указан.

Я понимаю, что .then() создает новый объект, и я должен явно передать аргументы этому объекту. Это создает 2 вопроса:

1) Почему аргумент actions определен внутри .then() в примере. Это из-за различий между Vue и React?

2) Поскольку connect() неявно разрешает объект user, как мне связать или добавить дополнительную переменную (в моем случае аргумент actions) к методу разрешения.

Вот мой синглтон-код:

var chatKitConnectionSingleton = (function () {
  var instance;

  function init({ state, actions }, uid) {

    new ChatManager({
      instanceLocator: "##:###:###-###-###-###",
      userId: uid,
      tokenProvider: new TokenProvider({url: '...' })
    })
      .connect({
      onAddedToRoom: room => {
        actions.selectRoomAsCurrent(room)
      },
      onRemovedFromRoom: room => {
        actions.removeRoomLocally(room.id)
      },
      onRoomDeleted: room => {
        actions.removeRoomLocally(room.id)
      }
    })
      .then(user => {
      actions.setCurrentUser(user)
      Promise.all(
        user.rooms.map(room =>
                       user.subscribeToRoom({
          roomId: room.id,
          hooks: {
            onNewMessage: message => {
              actions.newMessageArrived(message)
            }
          },
          messageLimit: 10
        })
                      )
      ).then(rooms => {
        actions.setRoomsFromChatkit(rooms)

      }).catch(err =>{
        actions.setRoomsFromChatkit([])
      })
    })
      .catch(error => console.log('CHATKIT | Error on connection', error))
  };

  return {

    getInstance: function ({ state, actions },uid) {
      if ( !instance ) {
        instance = init({ state, actions },uid);
      }
      return instance;
    }
  };
})();

EDIT

Я только что выяснил, что аргумент actions также не определен в хуках соединения: |

Полагаю, реальный вопрос в том, как передать компонент Vue methods в синглтон.

В настоящее время я делаю это, но оно разрешается до actions undefined.

  let chatManagerConnectPromise = chatConnection(this, uid)

Значение this не разрешится до {state, actions}, как в React. Кто-нибудь знает, как это сделать в Vue?

Очень ценится!

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Хорошо, это я переосмыслил проблему.

В Vue при передаче this внешней функции Vue не обрабатывает ее как {state, actions}, как React.

Аргумент (который в моем случае this) должен использоваться так же, как он используется внутри самого компонента. Вызов методов по this.myMethod()

Я изменил аргумент с {state, actions} -> actions на этом все сработало.

Спасибо за указатели!

0 голосов
/ 05 июля 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...