如何在执行下一行代码之前等待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;
如何在执行下一行代码之前等待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;
rallrall提供的正确答案在他的评论:你不能
我的解决方案是重新设计我的代码返回承诺,然后接收函数必须评估结果的东西沿线:
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。一个创建所有必须执行下一个代码之前要解决的承诺的数组:
Em.RSVP.Promise.all(arrayOfPromises).then(function(results){
//code that must be executed only after all of the promises in arrayOfPromises is resolved
});
这tooks我一段时间来回绕这种编程异步方式我的头 - 但一旦我做事情的工作相当不错。
您可以开始显示加载GIF,那么你可以订阅didLoad
事件备案,里面你可以继续你的实际处理..
record = App.User.find(1);
//show gif..
record.on("didLoad", function() {
console.log("ren loaded!");
});
//end gif; continue processing..
不幸的是,你认为我在某种观点上工作,我不是。 – TrevTheDev
如果您在控制器中工作,则可以发送视图可以处理的自定义事件并实现上述功能。看到'Ember.Evented'为相同:http://stackoverflow.com/questions/15991871/ember-js-how-to-trigger-view-method-from-controller – jacquard
我的问题仍然是如何暂停我的代码,直到承诺已解决。 – TrevTheDev
很好的问题。试图解决这个问题。很烦人。看起来承诺对于'观点'来说很好,但对于面向对象编程来说却很糟糕。你找到一个解决方案? – andy