【问题标题】:Return data from promise in nodejs从nodejs中的promise返回数据
【发布时间】:2020-05-18 23:59:46
【问题描述】:

我的承诺有问题,我无法从该承诺返回数据...

到目前为止,我已经尝试了不同的解决方案,但我无法让它发挥作用;我是新的承诺,我试图了解我做错了什么:

 try {
      const classList = options.hash.class;
      const filePath = path.resolve(__dirname, path.join(PATH.documentation, options.hash.startPath, options.hash.icon + ".svg"));
      let data = fs.readFileSync(filePath, "utf-8");
      let transformedSVG;

 // Promise
      const transformable = () => {

        // another promise... apparently
        svgo.optimize(data, { path: filePath }).then(function(result) {
          transformedSVG = result.data;
          transformedSVG = transformedSVG.replace(
            /^<svg/u,
            '<svg class=" ' + classList + '" '
          );
          return transformedSVG;
        });
      };

      // wait for Promise to be finished
      async function getResult() {
        let result = transformable;
        return result;
      }
      // wait for transformable to receive data and get the result
      async function doTask() {
        return await getResult();
      }

      // store svg data returned from doTask
      transformedSVG = doTask();
      console.log(transformedSVG);
} catch (err) {
      console.error(err);
}

有什么帮助吗?

【问题讨论】:

    标签: javascript node.js ecmascript-6 promise es6-promise


    【解决方案1】:

    你做错了几件事。我修复了问题并添加了评论:

      const transformable = () => {
        // another promise... apparently
        return svgo.optimize(data, { path: filePath }).then(function(result) { // <== add return
          transformedSVG = result.data;
          transformedSVG = transformedSVG.replace(
            /^<svg/u,
            '<svg class=" ' + classList + '" '
          );
          return transformedSVG;
        });
      };
    
      // wait for Promise to be finished
      async function getResult() {
        let result = await transformable(); // <== call the function with `await`
        return result;
      }
      // wait for transformable to receive data and get the result
      async function doTask() {
        return await getResult();
      }
    
      // store svg data returned from doTask
      transformedSVG = await doTask(); // <== add `await`
    

    还有一点需要注意的是你的doTask() 方法什么都不做,所以只需将其删除并直接调用await getResult()

    【讨论】:

    • getResult() 也不任何事情,你可以省略它,直接调用transformable() :-)
    • 谢谢,非常感谢,问题是我不能在那里使用 await,因为我收到错误消息,我只能在异步函数中使用 await。我确实在承诺中得到了结果,我可以完全正常地使用 console.log,但我无法返回它,所以我在模板 q.q 中获得了实际数据
    猜你喜欢
    • 2021-04-20
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2017-06-02
    • 2017-11-16
    • 1970-01-01
    相关资源
    最近更新 更多