JavaScript 链接承诺:在上一个承诺完成之前调用下一个承诺

JavaScript Chaining Promises : Calling next promise before previous has finished

工具:JavaScriptES6

关于链接多个承诺以按顺序执行的语法,我还没有看到一个好的简洁答案。我认为这对于所有有前途的新手来说都是解决棺材问题的好办法。 :)

我的问题是我想以同步顺序调用它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 有机会完成提取。

为什么会这样?我该如何编写承诺以按顺序执行?

initializeComplete 立即被调用,因为您在将它传递给 then 时正在调用它。您必须省略括号,就像您对 getPostsPromisegetThreadsPromise

所做的一样
userPromise.then(getPostsPromise).then(getThreadsPromise).then(initializeComplete);

虽然 yts 的回答是正确的(问题是您调用的是 initializeComplete 而不是传递函数),但我宁愿以不同的方式设置调用格式。让每个回调函数调用下一个函数有点违背承诺的设计。我宁愿每个函数 return 一个承诺,然后在 returned 承诺上调用 then

userPromise
.then(function(){
  return getPostsPromise()
}).then(function(){
  return getThreadsPromise()
}).then(function(){
  return initializeComplete();
});

或传递实际的 returned 对象而不必进行任何额外的中间处理:

userPromise
.then(getPostsPromise)
.then(getThreadsPromise)
.then(initializeComplete);