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

この単純な遅延を正しくする正しい方法は何ですか?

ロイハウの答えで編集:

// 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 を直接エクスポートできますが、それを使用できるのは.then1 回だけです ( )。これはおそらくあなたが望むものではありません。

代わりに、次を返す関数をエクスポートする必要があります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 実装を使用できますが、サードパーティのモジュール、たとえば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();

ただし、そのようなクラッジを回避するためにコードを書き直すことが望ましいでしょう(ただし、避けられないわけではありません-延期された約束を取り除くことができないコードが1つ残っているので、あなたの痛みを感じます

于 2015-07-11T06:48:18.613 に答える