Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺,参数在.then()中未定义,如何传递?_Javascript_Vue.js_Ecmascript 6_Promise - Fatal编程技术网

Javascript 承诺,参数在.then()中未定义,如何传递?

Javascript 承诺,参数在.then()中未定义,如何传递?,javascript,vue.js,ecmascript-6,promise,Javascript,Vue.js,Ecmascript 6,Promise,我正在使用一个指南来运行Promise中的一些父函数。这是一个React示例,我正在使用Vue.js 我的问题是,即使我构建了与示例完全相同的承诺,我仍然会遇到操作未定义的问题 也就是说,参数actions没有在thenable(.then())方法中定义 我知道.then()创建了一个新对象,我应该显式地向该对象传递参数。这就产生了两个问题: 1) 为什么参数actions是在示例中的.then()中定义的。 是因为Vue和React的差异吗 2) 由于connect()隐式解析为user对象

我正在使用一个指南来运行Promise中的一些父函数。这是一个React示例,我正在使用Vue.js

我的问题是,即使我构建了与示例完全相同的承诺,我仍然会遇到
操作未定义的问题

也就是说,参数
actions
没有在thenable(
.then()
)方法中定义

我知道
.then()
创建了一个新对象,我应该显式地向该对象传递参数。这就产生了两个问题:

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;
    }
  };
})();
编辑

我刚刚发现,
actions
参数在连接钩子中也是未定义的:|

我想真正的问题是,如何将Vue组件
方法
传递给单例

目前,我正在这样做,但它解决了
操作
未定义的问题

  let chatManagerConnectPromise = chatConnection(this, uid)
意思是
这个
不会像React那样解析为
{state,actions}
。有人知道如何在Vue中实现这一点吗


非常感谢

操作不在功能范围内。您需要手动绑定或使用ES6箭头函数来避免未定义。

好的,这是我过度思考的问题

  let chatManagerConnectPromise = chatConnection(this, uid)
在Vue中,当将
传递给外部函数时,Vue不会像React那样将其视为
{state,actions}

参数(在我的例子中是
this
)的使用方式应该与在组件内部使用的方式相同。通过
this.myMethod()调用方法

我将参数从
{state,actions}
->
actions
更改为所有操作都有效


谢谢你的指点

谢谢,但那没用<代码>操作
甚至在
返回承诺之前都是未定义的。所有(
以及承诺内部,即使使用建议的编辑。您可以将此函数init({state,actions},uid){->更改为({state,actions},uid)=>{}