我正在使用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)
})
答案 0 :(得分: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();
然而,重写你的代码以避免这样的问题会更好(但不是不可避免的 - 我仍然有一个代码片段我无法摆脱延迟的承诺,所以我感受到你的痛苦
答案 1 :(得分:4)
您可以直接导出承诺(而不是函数) - 就像您一样 - 但是您只能使用它(.then
)一次,这可能是不是< / em>你想要什么。
相反,您应该导出一个返回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(我非常推荐使用)。
答案 2 :(得分: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 });