Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.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
Ember.js 适配器中的Ember承诺感知头_Ember.js_Promise_Async Await_Aws Amplify_Amplifyjs - Fatal编程技术网

Ember.js 适配器中的Ember承诺感知头

Ember.js 适配器中的Ember承诺感知头,ember.js,promise,async-await,aws-amplify,amplifyjs,Ember.js,Promise,Async Await,Aws Amplify,Amplifyjs,正在寻找稍后使用异步调用返回的值在Ember适配器中设置头的方法 正在尝试从Amplify的Auth.currentSession设置idToken returend,这是一个promise函数,在到期时在内部处理刷新令牌 像这样的东西等待回应- headers: computed(async function() { return { 'Authorization': await Auth.currentSession().getIdToken();

正在寻找稍后使用异步调用返回的值在Ember适配器中设置头的方法

正在尝试从Amplify的Auth.currentSession设置idToken returend,这是一个promise函数,在到期时在内部处理刷新令牌

像这样的东西等待回应-

headers: computed(async function() {
        return {
          'Authorization': await Auth.currentSession().getIdToken();
        };
      })

我发现我们不能为头创建承诺感知的计算属性

我也不是在寻找使用ember simple auth/ember cognito或任何其他插件的解决方案,
我只需要使用plain amplify库和Ember adapters头就可以实现这一点一个可能的解决方案是覆盖适配器的ajax方法


最新版本(目前为3.21)的解决方案

导出默认类ApplicationAdapter扩展RestaAdapter{ @注入身份验证//我自己的身份验证服务 ajax…args{ 返回新的PromiseSolve,拒绝=>{ 这是。\u getHeaders.thenheaders=>{ 设置“标题”,标题; super.ajax…args.thenresolve,reject; }; } } 异步\u getHeaders{ const token=等待this.auth.token; 返回{ 'Authorization':'Bearer${token}` } } }
这是你要找的东西吗?跟踪标题获取建议@GokulKathirvel✌️. 希望跟踪属性是新的计算属性方式,因为我们仍然在2.15v中,不熟悉注释。虽然我认为这应该是同样的行为。如果要在头中设置的值将在服务内部的某个时间间隔内更新,我可以使用您的解决方案,并且我可以基于该服务属性计算/跟踪头的值。但对我来说,情况是,每当适配器中的头被调用时,只有在那一刻我才会进行异步调用以获取值并在头中设置。我不是Ember数据的用户。但是,您需要访问每个服务器请求的头,对吗?如果是这样,您可以提前进行getIdToken异步调用吗?但是,在每个请求上访问此异步调用似乎都是一种开销。如果过期,则每次都需要异步调用此异步调用以获取有效的idToken,检索一个手头有refreshToken的新idToken,这无论如何都会放大库行为。现在是的,就像你说的那样。在通过Ember数据进行呼叫之前,将预先收集令牌,并通过路由/组件层的adapter或snapshot.adapter.option进行设置。但是我需要重构它们,并将其移动到适配器层内部的一个位置。我尝试了这个方法&它似乎完全符合我的需要。首先对实际适配器的headers属性进行了一些调整,然后在ajax中在其上设置了其他异步属性。非常感谢,请提供一些解释,而不仅仅是代码。
import DS from 'ember-data';

export default DS.RESTAdapter.extend({
    async ajax(...args) {
        // Store the parent call, so it can be called after getting the current session.
        const _super = this._super.bind(this);

        // Sorry, I'm unfamiliar with how you're accessing amplify
        const headers = await amplify.currentSession();

        this.set('headers', {
            'Authentication': headers.auth
        });

        return _super(...args);
    }
});