【问题标题】:getting same response from a promise multiple times多次从承诺中获得相同的响应
【发布时间】:2021-07-23 20:24:48
【问题描述】:

我有一个可以返回承诺的函数,如果出现错误,我必须再次调用相同的函数。问题是每当我再次调用它时,我都会得到相同的响应,就好像它再也没有被调用过一样。

这是解决方法:

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 秒)我得到一个新的响应,但在这里我一遍又一遍地得到相同的响应。

如果标题不准确,请见谅;我不知道如何解释这个问题。

【问题讨论】:

    标签: javascript node.js asynchronous async-await promise


    【解决方案1】:

    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 的标志,可以让您观察到用于日志记录/错误处理的标志

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 2019-09-22
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多