【发布时间】:2015-09-11 20:36:52
【问题描述】:
function foo(options) {
var deferred = q.defer();
nonPromisifiedApi(options, deferred.resolve, deferred.reject);
return deferred.promise;
}
function bar() {}
function bam() {}
foo({})
.then(bar)
.then(bam);
在nonPromisifiedApi 完成其异步工作后,在依次调用bar 和bam 时,此代码是否会按预期工作?
【问题讨论】:
-
你测试了吗?看起来,
bar将执行 - 然后bam将执行但它们之间没有承诺.. 所以当bam运行时,bar不能保证完成! -
您的评论“您测试过吗”可以应用于本站 50% 的 cmets。我刚刚对其进行了测试,并将我的发现添加到答案中。你评论的其余部分是完全错误的。
-
您的
deferred.resolve和deferred.reject作为未绑定到实际延迟对象的函数传递。 bar 和 bam 也将被一一执行,之间没有任何延迟 -
感谢您强调绑定问题。但是,鉴于它“有效”,我怀疑 q 是否为了方便而预先绑定了函数。
-
另外,请注意 defer 的使用是非标准的,现在被认为是不好的做法。您可以考虑使用
Q.Promiseapi 的可能性。更好的是,您可以使用 ES6 polyfill 而不是Q(例如 github.com/jakearchibald/es6-promise)。这是一篇关于承诺的好文章:pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html。阅读它可能会回答您可能遇到的大部分问题。
标签: javascript promise q