我想了解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,
};
我们如何宣传对象变量?或类似的东西。
答案 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
,因此无法实现这些方法。