工具:JavaScript ES6
我还没有看到关于链接多个承诺按顺序执行的语法的简明扼要答案。我认为这对于所有承诺新手的棺材问题都是一个很好的指甲。 :)
我的问题是我想以同步顺序getPosts--->getThreads--->initializeComplete()
这就是我在做什么。
userPromise.then(getPostsPromise).then(getThreadsPromise).then(initializeComplete());
这是链中一个承诺的例子:
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
有机会完成抓取。
为什么会发生这种情况?如何编写承诺以按顺序执行?
答案 0 :(得分:7)
initializeComplete正在立即调用,因为在将其传递给then
时正在调用它。您必须省略括号,就像您对getPostsPromise
和getThreadsPromise
userPromise.then(getPostsPromise).then(getThreadsPromise).then(initializeComplete);
答案 1 :(得分:4)
虽然yts的答案是正确的(问题是你正在调用initializeComplete而不是传递函数),我宁愿格式化调用有点不同。让每个回调函数调用下一个函数有点违背promises的设计。我宁愿每个函数返回一个promise,然后在返回的promise上调用then
:
userPromise
.then(function(){
return getPostsPromise()
}).then(function(){
return getThreadsPromise()
}).then(function(){
return initializeComplete();
});
或传递实际返回的对象,而不必进行任何额外的中间处理:
userPromise
.then(getPostsPromise)
.then(getThreadsPromise)
.then(initializeComplete);