【发布时间】:2016-02-01 21:13:34
【问题描述】:
工具:JavaScript ES6
我还没有看到一个关于链接多个 Promise 以按顺序执行的语法的简洁的好答案。我认为对于所有承诺的新手来说,这将是解决棺材问题的好方法。 :)
我的问题是我想以同步顺序调用它getPosts--->getThreads--->initializeComplete()
这就是我正在做的事情。
userPromise.then(getPostsPromise).then(getThreadsPromise).then(initializeComplete());
- userPromise 是我从另一部分代码返回的 Promise obj
- getPostsPromise 返回一个 Promise 并获取服务器以获取帖子
- getThreadsPromise 返回一个 Promise 并获取线程的服务器
- initializeComplete 是一个回调,告诉我的程序它已初始化。
这里是链中的一个 Promise 示例:
var getPostsPromise = function(){
//Firebase is just a simple server I'm using
var firebasePostsRef = new Firebase("https://myfburl.firebaseio.com/posts");
var postsRef = firebasePostsRef.child(localPlace.key);
return new Promise(function(resolve, reject) {
//Below is a Firebase listener that is called when data is returned
postsRef.once('value', function(snap,prevChild) {
var posts = snap.val();
AnotherFile.receiveAllPosts(posts);
resolve(posts);
});
});
}
但是initializeComplete() 在getPostsPromise 和getThreadsPromise 有机会完成获取之前被调用。
为什么会发生这种情况以及如何编写要按顺序执行的 Promise?
【问题讨论】:
-
你必须从你的承诺链中返回一些东西来等待完成每个
-
@Michael 如果有人不需要将任何东西转移到下一个承诺,他们只需要按顺序运行(顺便说一句,我应该将它添加到问题中吗?)
-
没关系,什么都不做,只有返回部分很重要
-
then(()=>getPostsPromise).then...
-
对于初学者,您可能想尝试从
initializeComplete()中删除括号...
标签: javascript promise ecmascript-6 es6-promise