【问题标题】:How to convert callback based function into Promise based function? [duplicate]如何将基于回调的函数转换为基于 Promise 的函数? [复制]
【发布时间】:2018-02-08 19:37:55
【问题描述】:

目前,AWS documentation 有一个看起来像

的函数
describeInstances(params = {}, callback) ⇒ AWS.Request

我使用它的代码看起来像

let getAwsInstancesInfo = function () {
    console.log("getting AWS Instances information");
    return ec2.describeInstances(function (err, data) {
        if (err) {
            console.log("error in receiving instance information from EC2", err.stack);
            return Promise.reject("error in receiving instance information from EC2");
        } else {
            console.log("Total instances from EC2:", Object.keys(data["Reservations"]).length);
            return Promise.resolve(data);
        }
    });
};

在调用方,我愿意

getAwsInstancesInfo().then(data => {
    console.log("Total instances from EC2:", Object.keys(data["Reservations"]).length);
});

但是,它无法说出以下内容

index.js:12 Uncaught TypeError: Object(...)(...).then is not a function
    at InstanceSummary.componentDidMount (index.js:12)
    at ReactCompositeComponent.js:264
    at measureLifeCyclePerf (ReactCompositeComponent.js:75)
    at ReactCompositeComponent.js:263
    at CallbackQueue.notifyAll (CallbackQueue.js:76)
    at ReactReconcileTransaction.close (ReactReconcileTransaction.js:80)
    at ReactReconcileTransaction.closeAll (Transaction.js:209)
    at ReactReconcileTransaction.perform (Transaction.js:156)
    at batchedMountComponentIntoNode (ReactMount.js:126)
    at ReactDefaultBatchingStrategyTransaction.perform (Transaction.js:143)
    at Object.batchedUpdates (ReactDefaultBatchingStrategy.js:62)
    at Object.batchedUpdates (ReactUpdates.js:97)
    at Object._renderNewRootComponent (ReactMount.js:319)
    at Object._renderSubtreeIntoContainer (ReactMount.js:401)
    at Object.render (ReactMount.js:422)
    at Object../src/index.js (index.js:21)
    at __webpack_require__ (bootstrap 0a6128d5488129446b34:669)
    at fn (bootstrap 0a6128d5488129446b34:87)
    at Object.0 (registerServiceWorker.js:108)
    at __webpack_require__ (bootstrap 0a6128d5488129446b34:669)
    at bootstrap 0a6128d5488129446b34:715
    at bundle.js:719

我正在使用React.js,而我的package.json 看起来像

{
  "name": "myproject",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "aws-sdk": "^2.105.0",
    "material-ui": "^0.19.0",
    "react": "^15.6.1",
    "react-dom": "^15.6.1",
    "react-scripts": "1.0.12"
  },
  "scripts": {
    "api": "node src/api/index.js",
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}

【问题讨论】:

  • 您必须使用new Promise - 承诺不会改变这样一个事实,即回调中的return 毫无意义。但实际上只是使用内置的承诺支持:-)

标签: javascript reactjs amazon-ec2 ecmascript-6 promise


【解决方案1】:

https://aws.amazon.com/ko/blogs/developer/support-for-promises-in-the-sdk/

AWS.Request 对象支持 promise() 方法。请参阅此文档。

【讨论】:

    【解决方案2】:

    基于@Kangsu的帮助,我所要做的就是

    let getAwsInstancesInfo = function () {
        return ec2.describeInstances().promise();
    };
    

    就是这样。非常感谢@kangsu!

    【讨论】:

      猜你喜欢
      • 2017-06-19
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      相关资源
      最近更新 更多