在继续之前如何等待履行承诺

时间:2014-01-28 05:02:59

标签: ember.js

在执行下一行代码之前,我怎么能等到Promise得到解决?

e.g。

var option = null;
if(mustHaveOption){
   option = store.find("option", 1).then(function(option){ return option })
}
//wait until promise is resolved before returning this value
return option;

3 个答案:

答案 0 :(得分:7)

rallrall在他的评论中提供了正确答案:你不能

我的解决方案是重新设计我的代码以返回promises,然后接收函数必须根据以下方式评估结果:

function a(){
  var option = null;
    return  mustHaveOption ? store.find("option", 1) : false;
  }    
}

function b(){
   res = a();
   if (!res){
       res.then(function(option){
          // see option here
       });
   }
} 

我的另一个关键解决方案是使用hash of promises。在创建下一个代码之前,创建一个必须解决的所有promise的数组:

Em.RSVP.Promise.all(arrayOfPromises).then(function(results){
   //code that must be executed only after all of the promises in arrayOfPromises is resolved
});

我花了一些时间来围绕这种异步的编程方式 - 但是一旦我做了很好的工作。

答案 1 :(得分:2)

借助ES6,您现在可以使用async/await语法。它使代码更具可读性:

async getSomeOption() {
  var option = null;
  if (mustHaveOption) {
    option = await store.find("option", 1)
  }
}
return option;

PS:可以简化此代码,但我希望使其与上面给出的示例保持紧密联系。

答案 2 :(得分:1)

您可以开始显示加载gif,然后您可以订阅记录的didLoad事件,您可以在其中继续实际处理..

    record = App.User.find(1);

    //show gif..

    record.on("didLoad", function() {
        console.log("ren loaded!");
    });

    //end gif; continue processing..