EmberJS:在成功处理请求时解决承诺

EmberJS: Resolve promise in the success of processing request

本文关键字:解决 承诺 请求 处理 成功 EmberJS      更新时间:2023-09-26

我调整了RESTAdapter中的ajax调用,用于从vert.x总线桥检索数据。但是,我在处理请求的成功部分检索promise时遇到了问题。

我想问题出在Ember期望的数据结构形式上。这是我的适配器的代码:

var VertxAdapter = DS.RESTAdapter.extend({
  protocol: 'http',
  host: 'localhost',
  port: '4200',
  addressMapping: {
    "GET localhost/mindMaps": "mindMaps.list"
  },
  pendingRequests: [],
  vertx: function() {
    var adapter = this;
    if (typeof adapter._vertx === 'undefined') {
      adapter._vertx = new vertx.EventBus(adapter.protocol + '://' + adapter.host + ':' + adapter.port + '/eventbus');
      console.log('initialize vertx');
      adapter._vertx.onopen = function() { 
        // TODO: register for messages send from server to this client
        adapter.processPendingRequests.apply(adapter);
      };
    }
    return adapter._vertx;
  },
  ajax: function(url, type, params) {
   console.log(url, type, params);
    var adapter = this;
    var messageAddress = adapter.addressMapping[type + " " + url];
    return new Ember.RSVP.Promise(function(resolve, reject) {
      var success = function(json) {
        Ember.run(null, resolve, json);
      };
      var error = function(json) {
        Ember.run(null, reject, json);
      };
      if(adapter.vertx().readyState === vertx.EventBus.OPEN) {
        console.log('ready state');
        adapter.processRequest(messageAddress, params, success, error);
      } else {
        var pendingReq = {
          address: messageAddress,
          params: params,
          success: success,
          error: error
        };
        console.log('push pending req');
        adapter.pendingRequests.push(pendingReq);
      }
    });
  },
  processPendingRequests: function() {
    console.log('processPendingRequests');
    var adapter = this;
      adapter.pendingRequests.forEach(function(req){
        console.log(req);
          adapter.processRequest(req.address, req.params, req.success, req.error);
      });
  },
  processRequest: function(address, params, success, error) {
    console.log(address, params, success, error);
    var adapter = this;
    adapter.vertx().send(address, params, function(json){
      //TODO: implement
      //console.log(arguments);
      console.log(JSON.stringify(json));
     success(json);
      // error(json);
    });
    adapter.pendingRequests = [];
  }
});
export default VertxAdapter.extend({
    port: '8080'
});

这就是服务器:

var eventBus = require("vertx/event_bus");
var mindMaps = {};
var extend = function(obj, props) {
   for (var prop in props) {
      if (props.hasOwnProperty(prop)) {
         obj[prop] = props[prop];
      }
   }
   return obj;
};
eventBus.registerHandler("mindMaps.list", function(args, responder) {
    responder(
    {
        "data": Object.keys(mindMaps).map(function(key) {
            return extend(
                {
                    "type": "mindMaps"
                },
                mindMaps[key]
            );
        })
    });
});
eventBus.registerHandler("mindMaps.save", function(mindMap, responder) {
    if (!mindMap.id) {
        mindMap.id = Math.floor((Math.random() * 100) + 1);
    }
    mindMaps[mindMap.id] = mindMap;
    responder({
        "data": mindMap
    });
});
eventBus.registerHandler("mindMaps.delete", function(args, responder) {
    delete mindMaps[args.id];
    responder({});
});

这是控制台输出:

{"data":[{"type":"mindMaps","name":"One","id":59},{"type":"mindMaps","name":"Two","id":99},{"type":"mindMaps","name":"Three","id":55}]}
WARNING: Encountered "data" in payload, but no model was found for model name "datum" (resolved model name using mind-maps@serializer:-rest:.typeForRoot("data"))
Error while processing route: mind-maps Assertion Failed: The response from a findAll must be an Array, not undefined Error: Assertion Failed: The response from a findAll must be an Array, not undefined

我想我不会以Ember期望的形式从服务器返回数据

想法?

BR,米兰

除非您还想创建自己的序列化程序,否则JSON需要采用特定的格式。您可以在此处查看记录的格式。

如果您无法修改服务器以返回JSON格式,则需要编写自己的序列化程序,并将数据转换为此处列出的格式。

如果这听起来有点过分,那是因为它确实如此。我认为EmberData的适配器和序列化程序是它的首要问题。不幸的是,没有太多简单的方法可以做你想做的事。