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

Tre*_*Dev 12 ember.js

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

例如

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;
Run Code Online (Sandbox Code Playgroud)

Tre*_*Dev 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
       });
   }
} 
Run Code Online (Sandbox Code Playgroud)

对我来说,另一个关键的解决方案是使用承诺哈希值.在创建下一个代码之前,创建一个必须解决的所有promise的数组:

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

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


Mon*_*art 2

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

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

PS:这段代码可以简化,但我宁愿让它与上面给出的示例保持接近。