【问题标题】:return promise from function which using fetch从使用 fetch 的函数返回承诺
【发布时间】:2018-09-12 12:39:07
【问题描述】:

我的问题是我每隔 x 秒调用一次刷新令牌函数,我在 refreshToken 函数中硬编码导航到主页 并且 can't clear interval 在进行导航时在函数中,因为间隔是在另一个文件中声明的。

我想要的是从其他文件调用 refreshToken 并返回承诺 是否需要将用户导航到主页(如果响应访问令牌或刷新令牌为空,则导航到主页),如果是则清除间隔并在此之后导航。

这是在 methods.js 中的 refreshToken 函数:

let refreshToken=(url,refresh_token)=>{

console.log("access_token check");
let currentMin=getMinute();

if(currentMin===0){
    currentMin=60;
}
if(appSettings.getNumber("tkTime") > currentMin){
    currentMin=currentMin+60;
}

if(currentMin - appSettings.getNumber("tkTime") >= 4){

    fetch(url,{
        headers: new Headers({
            'Content-Type': 'application/json',
            'Authorization':`Bearer ${refresh_token}`
          }),
        method:'POST'
    }).then((res) => {


        return res.json();          
    }).then((data)=>{
        if(data.refresh_token !== null || data.access_token !== null){

            appSettings.setString("refresh_token",data.refresh_token);
            appSettings.setString("access_token",data.access_token);
            appSettings.setNumber("tkTime",getMinute());  
            console.log("token refreshed");
        }
        else{
            topmost().navigate({moduleName:"Home/home",clearHistory: true});
        }

    })
    .catch(error => {
        console.log(error);

    });
}    

}

这是我从 userPage.js 调用此函数时的代码部分:

 const myModules = require('~/methods.js');
 myModules.refreshToken(myModules.refUrl,appSettings.getString("access_token"),appSettings.getString("refresh_token"));

ref=timer.setInterval(() => {
    myModules.refreshToken(myModules.refUrl,appSettings.getString("access_token"),appSettings.getString("refresh_token"));
},1000*30);

【问题讨论】:

  • 从函数返回promise,并在另一个模块中做.then(data => { if (!data.token) { clearInterval(); navigate(); } }).catch(console.error)部分。
  • @Bergi 我的问题是在这种情况下如何从函数中返回承诺,我知道那么热使用
  • 只需在你的承诺链前面放一个return

标签: javascript ecmascript-6 nativescript es6-promise fetch-api


【解决方案1】:

从函数返回 fetch 并写句柄 else 条件,否则它会中断。

let refreshToken = (url, refresh_token) => {
    console.log("access_token check");
    let currentMin = getMinute();
    if (currentMin === 0) {
        currentMin = 60;
    }
    if (appSettings.getNumber("tkTime") > currentMin) {
        currentMin = currentMin + 60;
    }
    if (currentMin - appSettings.getNumber("tkTime") >= 4) {
        return fetch(url, {
            headers: new Headers({
                'Content-Type': 'application/json',
                'Authorization': `Bearer ${refresh_token}`
            }),
            method: 'POST'
        }).then((res) => {
            return res.json();
        }).then((data) => {
            if (data.refresh_token !== null || data.access_token !== null) {
                appSettings.setString("refresh_token", data.refresh_token);
                appSettings.setString("access_token", data.access_token);
                appSettings.setNumber("tkTime", getMinute());
                console.log("token refreshed");
            } else {
                topmost().navigate({
                    moduleName: "Home/home",
                    clearHistory: true
                });
            }
        })
    } else {
        // .then will throw an error if not write
        return new Promise(resolve => resolve( /*Some Data*/ ));
    }
}

【讨论】:

    猜你喜欢
    • 2021-01-28
    • 2017-04-05
    • 1970-01-01
    • 2018-05-16
    • 2019-01-23
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多