Как ждать выполнения обещания, прежде чем продолжить

Как я могу подождать, пока обещание не будет разрешено до выполнения следующей строки кода?

например.

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;

Ответ 1

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
       });
   }
} 

Другим ключевым решением для меня было использование хеша promises. Один создает массив всех promises, которые должны быть разрешены перед выполнением следующего кода:

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

Мне потребовалось некоторое время, чтобы обернуть голову вокруг этого асинхронного способа программирования, но как только я сделал что-то очень хорошо.

Ответ 2

Вы можете начать показывать gif загрузки, затем вы можете подписаться на событие didLoad для записи, внутри которой вы можете продолжить фактическую обработку.

    record = App.User.find(1);

    //show gif..

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

    //end gif; continue processing..