5

我正在将 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)
})

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

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

3 回答 3

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

文件2.js

import { getUsersFromDatabase } from './file1'

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

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

于 2015-07-11T06:39:20.527 回答
5

我非常习惯于 jQuery 的 Deferred 对象,我正在努力寻找它的 ES2015 等价物

如果您必须使用deferred,这应该可以

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();

然而,重写你的代码以避免这种混乱会更好(但并非不可避免 - 我仍然有一段代码我无法摆脱延迟承诺,所以我感受到你的痛苦

于 2015-07-11T06:48:18.613 回答
0

此类将允许您使用常规的 Promise 方法以及其他resolve(value)方法。这应该为您提供与jQuery.deferred().

function DeferredPromise() {
    var _resolve = null;
    var _reject = null;

    this.promise = new Promise(function(resolve, reject) {
        _resolve = resolve;
        _reject = reject;
    });
    this.then = function() {
        return this.promise.then(...arguments);
    }
    this.catch = function() {
        return this.promise.catch(...arguments);
    }
    this.resolve = function() {
        _resolve(...arguments);
    }
    this.reject = function() {
        _reject(...arguments);
    }
}

然后你可以用它来创建一个新的DeferredPromise

var p = new DeferredPromise();

等待它:

p.then(val => {
    console.log('val(1)', val);
})

也许再等一次,你也可以用常规链接它Promise

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 });
于 2017-10-28T05:08:18.103 回答