JavaScript Chaining Promises:在上一个完成之前调用下一个promise

Nic*_*eda 3 javascript promise ecmascript-6 es6-promise

工具:JavaScript ES6

我还没有看到关于链接多个promises以按顺序执行的语法的简洁答案.我认为这对于所有承诺新手的棺材问题都是一个很好的指甲.:)

我的问题是我想以同步顺序调用它 getPosts--->getThreads--->initializeComplete()

这就是我在做的事情.

userPromise.then(getPostsPromise).then(getThreadsPromise).then(initializeComplete());
Run Code Online (Sandbox Code Playgroud)
  • userPromise是Promise obj我从代码的另一部分返回
  • getPostsPromise返回一个Promise并向服务器提取帖子
  • getThreadsPromise返回一个Promise并为服务器提取线程
  • 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);
        }); 
      });
}
Run Code Online (Sandbox Code Playgroud)

但是initializeComplete()之前被召唤getPostsPromisegetThreadsPromise有机会完成抓取.

为什么会发生这种情况?如何编写承诺以按顺序执行?

yts*_*yts 7

initializeComplete正在被调用,因为你在传递它时正在调用它then.你必须省略括号,就像你一样的getPostsPromisegetThreadsPromise

userPromise.then(getPostsPromise).then(getThreadsPromise).then(initializeComplete);
Run Code Online (Sandbox Code Playgroud)