多次从承诺中获得相同的响应
getting same response from a promise multiple times
我有一个函数可以 return 一个承诺,如果出现错误,我必须再次调用同一个函数。问题是,每当我再次调用它时,我都会得到相同的响应,就好像它从未被再次调用过一样。
我是这样解决的:
first_file = async () => {
return new Promise(async (resolve, reject) => {
//Generating the token
(async () => {
while (true) {
console.log("Resolving...");
resolve(token);
await sleep(5000);
resolved_token = token;
}
})();
});
};
我在这里生成一个令牌,我在第二个脚本中使用它:
function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
(async() =>{
while(true){
test = require("./test")
test.first_file ().then(res=>{
console.log(res)
})
await sleep(15000)
}
})()
这里的预期值是每 15000 毫秒(15 秒)我得到一个新的响应,但在这里我一遍又一遍地得到相同的响应。
如果标题不准确,请见谅;我不知道怎么解释这个问题。
Promise代表一个价值+时间,一个promise的定值不会像数字5一样不会改变。多次调用 resolve
是空操作*。
你想做的不是使用语言对值+时间的抽象,而是使用语言对动作+时间的抽象——一个异步函数(或者只是一个返回承诺的函数)
const tokenFactory = () => {
let current = null;
(async () =>
while (true) {
console.log("Resolving...");
current = token; // get token somewhere
await sleep(5000);
}
})().catch((e) => {/* handle error */});
return () => current; // we return a function so it's captured
};
哪个会让你做:
tokenFactory(); // first token (or null)
// 5 seconds later
tokenFactory(); // second token
*我们在 Node.js 中添加了一个名为 multipleResolves
的标志,让您可以观察到 logging/error 处理
我有一个函数可以 return 一个承诺,如果出现错误,我必须再次调用同一个函数。问题是,每当我再次调用它时,我都会得到相同的响应,就好像它从未被再次调用过一样。
我是这样解决的:
first_file = async () => {
return new Promise(async (resolve, reject) => {
//Generating the token
(async () => {
while (true) {
console.log("Resolving...");
resolve(token);
await sleep(5000);
resolved_token = token;
}
})();
});
};
我在这里生成一个令牌,我在第二个脚本中使用它:
function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
(async() =>{
while(true){
test = require("./test")
test.first_file ().then(res=>{
console.log(res)
})
await sleep(15000)
}
})()
这里的预期值是每 15000 毫秒(15 秒)我得到一个新的响应,但在这里我一遍又一遍地得到相同的响应。
如果标题不准确,请见谅;我不知道怎么解释这个问题。
Promise代表一个价值+时间,一个promise的定值不会像数字5一样不会改变。多次调用 resolve
是空操作*。
你想做的不是使用语言对值+时间的抽象,而是使用语言对动作+时间的抽象——一个异步函数(或者只是一个返回承诺的函数)
const tokenFactory = () => {
let current = null;
(async () =>
while (true) {
console.log("Resolving...");
current = token; // get token somewhere
await sleep(5000);
}
})().catch((e) => {/* handle error */});
return () => current; // we return a function so it's captured
};
哪个会让你做:
tokenFactory(); // first token (or null)
// 5 seconds later
tokenFactory(); // second token
*我们在 Node.js 中添加了一个名为 multipleResolves
的标志,让您可以观察到 logging/error 处理