【问题标题】:How can I export promise result?如何导出承诺结果?
【发布时间】:2017-08-14 23:05:11
【问题描述】:

此代码可以正常工作。在所有承诺成功解决后,我只需要导出数据变量。

我无法将此代码用于函数和导出变量。因为在这种情况下,这个函数会导出一个空数组。

'use strict'

import urls from './urls'
import getData from './get-data'

getData(urls).then((responses) => {
    const data = []
    const results = responses.map(JSON.parse)

    for (let i = 0, max = results.length; i < max; i++) {
        // some magic and pushing 
    }

    return data
}).catch(error => console.log(error))

【问题讨论】:

标签: javascript promise es6-promise


【解决方案1】:

您应该使用 Promise 构造函数和自定义

mypromise.js

export function get_data(){
  const get_data = new Promise(function(resolve, reject) {
    try {
      //do your stuff 
      return resolve('success'); // change this to whatever data your want
    } catch (err) {
      return reject(err);
    }
  });
  //return promise 
  return get_data;
}

导入

import * as data from './mypromise'

data.get_data()
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

【讨论】:

    【解决方案2】:

    编辑 2021

    节点 > 14.3

    由于节点现在支持top-level-await,因此解决方案更加基础

    foo.js

    export await new Promise()
    

    index.js

    import foo from './foo.js' // the import wait for the promise to be resolved
    
    console.log(foo) 
    

    节点14.3以下

    现在你做的

    foo.js

    const wait = ms => new Promise(resolve => setTimeout(resolve, ms))
    
    async function foo() {
        console.log('called')
        await wait(1000)
        return 'hi'
    }
    
    export default foo()
    

    index.js

    import foo from './foo'
    
    void (async function() {
        console.log(foo)
        console.log(await foo)
        console.log(await foo)
    })()
    

    输出

    > called
    > Promise { <pending> }
    > hi
    > hi
    

    在开始时获取数据很有用

    【讨论】:

      【解决方案3】:

      您可以轻松地将其分配给导出的变量,但您不应该这样做 - 分配是异步发生的,并且可能会在此之前在导入它的模块中读取该变量。

      因此,只需导出承诺1

      // data.js
      import urls from './urls'
      import getData from './get-data'
      
      export default getData(urls).then(responses =>
          responses.map(JSON.parse).map(magic)
      );
      

      // main.js
      import dataPromise from './data'
      
      dataPromise.then(data => {
          console.log(data);
          …
      }, console.error);
      

      1:直到proposed top-level await出现,您可以等待该值再导出。

      【讨论】:

      • 期待顶级await!
      • 这里怎么传参数?
      • @ßãlãjî 将参数从哪里传递到哪里?你想导出一个返回承诺的函数而不是一个承诺吗?
      【解决方案4】:

      您可以通过简单地解析要导出的模块中的promise来导出您的promise结果,然后在then()块中使用exports.variable_name = promiseResult;

      例如: 我想在我的整个应用程序中使用数据库连接。但连接电话给我一个承诺。 所以我可以简单地调用 promise.then 然后我阻止,导出我想要的结果。 Connection.js 文件

      async function connect() {
          connection = await oracledb.getConnection(config)
      if (connection) {
          return connection;
      } else {
          return null;
        }
      }
      
      connect().then((res) => {
          exports.connection = res;
      });
      

      然后在 main.js 文件中,只需要 connection.js 文件。

      但这不是好的做法,因为如果您的承诺失败或花费太多时间来解决,并且在解决之前在某处使用它,可能会导致错误。

      【讨论】:

        猜你喜欢
        • 2018-08-12
        • 1970-01-01
        • 1970-01-01
        • 2020-03-18
        • 1970-01-01
        • 2018-11-25
        • 1970-01-01
        • 2017-10-18
        • 1970-01-01
        相关资源
        最近更新 更多