javascript - 如何用回调重写 promise 的结果

标签 javascript asynchronous callback

有一个函数可以生成一个字符串,如果它在 User 表中则返回它。

 function generateFortToken(len) {
       let rs; 

        rs = randomstring.generate(len);
        User.findOne({where: {fort_token: rs}})
                .then(result => {
                    console.log("hit is : ", result);
                    if (!result) //need to return rs. but HOW?
                })
                .catch(err => {
                    console.log("Error search for fort token : ", err.message);
            });        

}

这个 generateFortToken 位于模块 helper 中,并从父函数中调用,如下所示:

user.fort_token = helper.generateFortToken(20);

由于 findOne 返回一个 promise,此代码无法像许多在线帖子指出的那样工作。但是我很难用回调重写它以返回生成的 token 的值。

最佳答案

您编写的代码很好,但还可以改进。特别是,你已经陷入了 Promise constructor antipattern .简而言之,当您可以使用 User.findOne< 返回的 promise 时,您正在构建一个新的 promise (await new Promise(next => User.findOne(...)))/直接:

async function generateFortToken(len) {
  for (let rs;; rs = randomstring.generate(len)) {
    try {
      if (await User.findOne({ where: { fort_token: rs }})) {
        return rs;
      }
    }
    catch (err) {
      console.log('Error search for fort token : ', err.message);
    }
  }
}

关于javascript - 如何用回调重写 promise 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55842991/

相关文章:

javascript - 停止 Javascript 执行以阻止 selenium webdriver

javascript - 获取表中除第一列之外的所有输入值

javascript - 带参数的 Phaser 按钮处理函数

java - 当任何给定的 CompletableFutures 完成且结果与某个谓词匹配时,如何创建一个完成的 future ?

Java Spark : Non-blocking routes/callbacks with CompletableFutures

javascript - ESLint 与 Babel plugin-proposal-export-default-from

c# - 多线程列表模式建议

c# - 使用 Task 时,如果 ThreadPool 已满/忙会发生什么情况?

callback - before_destroy 回调不会阻止记录被删除

boost - 延迟后未调用 async_write_some 回调