Javascript 2015年欧洲标准普尔等值美元递延()

Javascript 2015年欧洲标准普尔等值美元递延(),javascript,jquery,promise,ecmascript-6,es6-promise,Javascript,Jquery,Promise,Ecmascript 6,Es6 Promise,我在用巴别塔做一个项目,我遇到了一个非常基本的问题。我非常习惯jQuery的延迟对象,我正在努力寻找它的ES2015等价物,以下是我基本上想要的: // file1.js let dfd = new Promise() function functionCalledAtSomePoint(thing) { dfd.resolve(thing) } export default { dfd } // file2.js import { dfd } from './file1' d

我在用巴别塔做一个项目,我遇到了一个非常基本的问题。我非常习惯jQuery的延迟对象,我正在努力寻找它的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)
})
正确的方法是什么

编辑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)
})

您可以直接导出承诺(而不是函数)——就像您所做的那样,但是您只能使用它(
。然后
)一次,这可能不是您想要的

相反,您应该导出一个返回承诺的函数:

p.then(val => {
    console.log('val(2)', val);
    return 42;
 }).then(val => {
    console.log('.then(somethingElse)', val);
 })
 .catch(err => { console.error('err', err); })
文件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)
        })
    })
}
import { getUsersFromDatabase } from './file1'

getUsersFromDatabase().then((users) => {
    // success
}).catch((err) => {
    // no users
})
file2.js

import User from '../models/user'

export function getUsersFromDatabase () {
    return new Promise((resolve, reject) => {
        User.find({}, (err, users) => {
            return err ? reject(err) : resolve(users)
        })
    })
}
import { getUsersFromDatabase } from './file1'

getUsersFromDatabase().then((users) => {
    // success
}).catch((err) => {
    // no users
})
您可以使用默认的Promise实现,例如(我非常推荐使用)

我非常习惯jQuery的延迟对象,我很难找到它的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();

然而,重写代码以避免这样的混乱会更好(但不是不可避免的-我仍然有一段代码我无法摆脱延迟承诺,所以我觉得你的痛苦这门课将允许你使用常规承诺方法以及额外的
解析(值)
method。这将为您提供与
jQuery.deferred()类似的功能

然后,您可以使用它创建新的延迟承诺:

等待它:

p.then(val => {
    console.log('val(1)', val);
})
也许再等一次,你也可以用一个常规的
承诺来连锁:

p.then(val => {
    console.log('val(2)', val);
    return 42;
 }).then(val => {
    console.log('.then(somethingElse)', val);
 })
 .catch(err => { console.error('err', err); })
并随时解决它:

p.resolve({ username: 'Luke.Skywalker', age: 42 });

巴贝尔有一个信息丰富的“入门”指南,其中谈到了es6中的承诺:我先读了它,然后是MDN,然后是Google上的东西,我仍然无法理解它:/这可能是重复的承诺,相当于jquery deffered-正如我在回答中所说的,你应该避免
延迟模式
,但现有的代码有时会成为转换的噩梦这是一个很好的答案,对于那些可能仍想使用$.Deferred的人来说,但这不是我的情况。我当时误解了这个问题:p@JaromandaX然后他可以使用默认实现(目前速度非常慢).bluebird符合Promise/A+标准,因此它应该可以作为替代品使用。@zerkms我找不到我要找的确切页面,但可以告诉你。请注意本机实现的速度慢了一个数量级(389 v.3532)。