我在一个项目中使用 Babel,但遇到了一个非常基本的问题。我非常习惯 jQuery 的 Deferred 对象,我正在努力寻找它的 ES2015 等价物,这就是我基本上想要的:
// file1.js
let dfd = new Promise()
function functionCalledAtSomePoint(thing) {
dfd.resolve(thing)
}
export default { dfd }
// file2.js
import { dfd } from './file1'
dfd.then((thing) => {
console.log('Yay thing:', thing)
})
写这个简单的 deferred 的正确方法应该是什么?
使用 royhowie 的回答进行编辑:
// file1.js
let thing
function getThing(_thing) {
return new Promise((resolve) => {
if (el) {
thing = new Thing(el)
}
resolve(thing)
})
}
function functionCalledAtSomePoint(el) {
getThing(el)
}
export default { getThing }
// file2.js
import { getThing } from './file1'
getThing.then((thing) => {
console.log('Yay thing:', thing)
})
最佳答案
您可以直接导出 promise (而不是函数)——就像您所做的那样——但是您只能使用它 (.then
) 一次,这可能是 不是你想要的。
相反,您应该导出一个返回 Promise
的函数:
文件1.js
import User from '../models/user'
export function getUsersFromDatabase () {
return new Promise((resolve, reject) => {
User.find({}, (err, users) => {
return err ? reject(err) : resolve(users)
})
})
}
file2.js
import { getUsersFromDatabase } from './file1'
getUsersFromDatabase().then((users) => {
// success
}).catch((err) => {
// no users
})
您可以使用默认的 Promise 实现,but it much slower than 3rd party modules ,例如 bluebird (我非常推荐使用)。
关于javascript - ES2015 相当于 $.Deferred(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31354216/