多次从承诺中获得相同的响应

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 处理