promisifyAll in bluebird.js

时间:2017-02-14 19:51:25

标签: javascript object promise bluebird

我想了解promisifyAll的工作原理。我正在努力理解他们的文档中给出的示例。任何人都可以给我一个简单的例子,它是如何工作的?我试图理解这个概念以及我们如何使用它。谢谢

import React, { Component } from 'react';
import PropTypes from 'prop-types';

/**
 * Component that alerts if you click outside of it
 */
export default class OutsideAlerter extends Component {
  constructor(props) {
    super(props);

    this.setWrapperRef = this.setWrapperRef.bind(this);
    this.handleClickOutside = this.handleClickOutside.bind(this);
  }

  componentDidMount() {
    document.addEventListener('mousedown', this.handleClickOutside);
  }

  componentWillUnmount() {
    document.removeEventListener('mousedown', this.handleClickOutside);
  }

  /**
   * Set the wrapper ref
   */
  setWrapperRef(node) {
    this.wrapperRef = node;
  }

  /**
   * Alert if clicked on outside of element
   */
  handleClickOutside(event) {
    if (this.wrapperRef && !this.wrapperRef.contains(event.target)) {
      alert('You clicked outside of me!');
    }
  }

  render() {
    return <div ref={this.setWrapperRef}>{this.props.children}</div>;
  }
}

OutsideAlerter.propTypes = {
  children: PropTypes.element.isRequired,
};

我们如何宣传对象变量?或类似的东西。

1 个答案:

答案 0 :(得分:2)

首先,您需要了解nodeFunction的工作原理。它将回调函数作为最后一个参数。这个回调有两个参数,第一个是error,第二个是数据。例如,考虑require("fs").readFile

// This is the callback
function callback (error, data) {
  if (error) {
    console.error('There was an error', error)
  } else {
    console.log('This is the data', data)
  }
}
require('fs').readFile('my-file.txt', callback)

请注意,这是一种约定,JS本身没有任何内容可以强制执行它。

现在让我们转到Promise.promisify。此方法需要nodeFunction并返回 promisified 版本。这或多或少都是它的作用:

function promisifiedReadFile (filePath) {
  return new Promise(function (fulfill, reject) {
    require('fs').readFile(path, function (error, data) {
      if (error) { reject(error) } else { fulfill(data) }
    })
  })
}

它有点冗长,但正如您所看到的,您现在拥有一个readFile版本,它返回一个承诺而不是接受回调。当然,此示例是readFile的硬编码,Promise.promisify适用于任何nodeFunction

const promisifiedReadFile = Promise.promisify(require('fs').readFile)

两种promisifiedReadFile方法的工作方式相同。

最后,Promise.promisifyAll接受一个对象,遍历它并找到所有方法,然后将Promise.promisify应用于每个方法。

因此,如果你调用Promise.promisifyAll(require('fs')),你会得到fs模块的版本,其中所有方法都返回promises而不是接受回调。

关于您的示例我不确定您要实现的目标,但您定义的方法不是nodeFunctions,因此无法实现这些方法。