【发布时间】:2018-02-26 22:06:24
【问题描述】:
我的课程设计和承诺存在一些问题。我正在尝试通过递归调用我的 promise cb 来监听更改变量。当 networkResponse 返回一个有效(非空)令牌时,我正在尝试解决它,否则它将通过在每次调用中延迟 500 毫秒来检查 500 次。
这是我现在简化的课程:
class Tokenizer {
constructor(page) {
this.page = page;
this.token = null;
this.tries = 500;
this.page.on('response', this.onNetworkResponse.bind(this));
}
async onNetworkResponse(response) {
if (condition) {
let resp = await response.text();
let regex = /access_token=([\w\d]+)/g;
let _token = regex.exec(response);
this.token = _token[1];
}
}
getToken() {
return new Promise(function cb(resolve, reject) {
console.log(this.tries + ' remaining');
if (--this.tries > 0 && !this.token) setTimeout(() => cb(resolve, reject), 500);
else (this.tries <= 0) ? reject('Try') : resolve(this.token);
});
}
}
我这样称呼承诺:
const t = new Tokenizer();
let test = async () => {
let token = await t.getToken();
}
test();
但是我在 cb 函数中失去了这个范围。如果有人能回答这个问题,我将不胜感激
对于谁有这样的问题,我刚刚更新了我的 getToken 函数,如下所示:
getToken() {
var cb = (resolve, reject) => {
console.log(this.tries);
if (--this.tries > 0 && !this.token) setTimeout(() => cb(resolve, reject), 500);
else (this.tries <= 0) ? reject('Try') : resolve(this.token);
}
return new Promise(cb);
}
【问题讨论】:
-
是的,只是不要使用
function cb,而是使用箭头函数。
标签: scope promise async-await es6-class puppeteer