javascript - ES2015 相当于 $.Deferred()

标签 javascript jquery promise ecmascript-6 es6-promise

我在一个项目中使用 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/

相关文章:

javascript - ExtJS 更改事件监听器未能触发

javascript - 异步/等待 promise 逻辑问题

javascript - Angular : Promise dependant on other promises in routing

javascript - 凹坑 x2 轴需要位置绑定(bind)到 x

javascript - 无法仅过滤数组的唯一值

javascript - 如何在触发 onclick 事件时将 id 从 View (HTML)传递到 AngularJs Controller ?

javascript - blockUI 无法在 Internet Explorer 上运行

javascript - 如何从 html 调用 jquery 代码中的外部函数?

javascript - CSS li 没有排队。可能是周期问题

javascript - async/await 总是返回 promise