工具: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()getPostsPromisegetThreadsPromise 有机会完成获取之前被调用。

    为什么会发生这种情况,我如何编写要按顺序执行的 promise ?

    最佳答案

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

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

    关于JavaScript 链式 Promise : Calling next promise before previous has finished,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33469962/

    10-10 12:54