【问题标题】:DELETE request is completing before GET request when trying to findRecord and destroyRecord in ember在 ember 中尝试 findRecord 和 destroyRecord 时,DELETE 请求在 GET 请求之前完成
【发布时间】:2016-07-18 13:45:51
【问题描述】:

我在 ember 2.6 中有以下代码;余烬数据 2.6.1

import Ember from 'ember';

export default Ember.Route.extend({
    activate() {
        var route = this;
        var sessionId = localStorage.getItem('sessionId');
        if (sessionId) {
            localStorage.removeItem('sessionId');
            this.store.findRecord('session', sessionId).then(function found(session) {
                session.destroyRecord();
                route.transitionTo('index');
            });
        } else {
            this.transitionTo('sessions.new');
        }
    }
});

我有一个注销按钮,其 hbs 模板代码为:

<li>{{#link-to 'sessions.delete'}}{{fa-icon "fa-lock"}} Logout{{/link-to}}</li>

Route.extend 代码在调用 /sessions/delete 时执行!

我观察到的是 REST 调用的顺序是:

1) ***DELETE*** http://dozee.me:3000/api/sessions/<sessionId>
2) ***GET*** http://dozee.me:3000/api/sessions/<sessionId>

第二个 REST 请求抛出错误,因为到那时会话/cookie 已被清理。

我期望的是 REST 调用的顺序实际上应该是相反的,但我无法弄清楚为什么不是这样!

任何指针和提示将不胜感激;)

【问题讨论】:

  • 这是从哪里来的(函数找到(会话)?
  • findRecord 应该返回一个 Promise。不是吗?
  • 是的,但我从来没有见过那个函数调用......这就是我问的原因......我所做的是这个......然后((会话)=> {...}) ;如果你使用 ES6 和胖箭头......所以在你的例子中找到的函数是额外的......它也可以是这样的 then(function(session) { }....尝试不使用它......但不确定是否命名一个函数会有所作为......
  • 这应该可以!您是否也可以在其他地方致电findRecord
  • 这就是我拥有的路线的所有代码。我没有看到 findRecord 在其他任何地方被调用。

标签: javascript ember.js ember-data


【解决方案1】:

这可能是因为 ember 已经在商店中拥有该会话并将该对象返回给您并尝试稍后通过进行 GET 调用来更新该对象。

这可能在 delete 之后发生,因为 promise 已经通过 store 对象解析。

你可以做的是首先使用 peekRecord 在存储中查找会话对象,并且仅当在存储中找不到对象时才调用 findRecord。

另一种方法是为会话的 findRecord 进行伪造的服务器调用,直到对象从服务器返回时才会得到解决。

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2020-03-04
    • 2018-12-05
    • 2016-08-04
    相关资源
    最近更新 更多