ES2015相当于$ .Deferred()

Cal*_*ein 4 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)
})
Run Code Online (Sandbox Code Playgroud)

什么应该是正确的方法来纠正这个简单的延期?

用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)
})
Run Code Online (Sandbox Code Playgroud)

roy*_*wie 5

您可以直接导出 promise(而不是函数)——就像你有的那样——但是你只能使用它 ( .then) 一次,这可能不是你想要的。

相反,您应该导出一个返回 a 的函数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)
        })
    })
}
Run Code Online (Sandbox Code Playgroud)

文件2.js

import { getUsersFromDatabase } from './file1'

getUsersFromDatabase().then((users) => {
    // success
}).catch((err) => {
    // no users
})
Run Code Online (Sandbox Code Playgroud)

您可以使用默认的 Promise 实现,但它比 3rd party modules 慢得多,例如bluebird(我非常推荐使用)。


Jar*_*a X 5

我已经习惯了jQuery的Deferred对象,而且我很难找到它的ES2015等价物

如果你必须使用延迟,这应该工作

function makeDeferred() {
    var res, rej;
    let dfd = new Promise(function(resolve, reject) {
        res = resolve;
        rej = reject;
    });
    dfd.resolve = res;
    dfd.reject = rej;
    return dfd;
}
let dfd = makeDeferred();
Run Code Online (Sandbox Code Playgroud)

然而,重写代码来避免这样的杂牌将是可取的(但不是不可避免的-我仍然有一个一块的代码,我无法摆脱在延期承诺,所以我觉得你的痛苦