在执行下一行代码之前,我怎么能等到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;
答案 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..