2015-06-02 3 views
0

Я использовал обещания какое-то время, но время от времени я спотыкаюсь о проблемах, которые я не могу решить (каламбур не предназначен).Почему мой хэш обещаний решить, прежде чем сработало обещание решить?

У меня есть массив файлов, для которых я должен выполнять асинхронные функции, чтобы каждый файл извлекал некоторые метаданные.

Я использую RSVP.hash() и передаю массив обещаний, возвращаемых функцией, загружающей некоторые метаданные, и добавляет ее в качестве свойств к файлу. Моя проблема заключается в том, что обещание, возвращенное функцией hash(), разрешается до того, как любое из пройденных обещаний будет разрешено, и поэтому оно слишком быстро входит в функцию then().

Я создал JSfiddle, который иллюстрирует мою проблему. Я изучил возможность того, что это не связано с RSVP, но вместо того, как интерпретатор JavaScript читает код и, возможно, делает немедленную оценку той части, которая, как я думал, будет последней.

Я использую RSVP.hash() неправильный путь, отсутствует что-то или какие-либо другие ошибки в моем коде, которые заставили бы его вести себя таким образом, а не мои намерения?

Ниже приведен фрагмент кода такой же, как у JSFiddle.

function checkFileStatus(item) { 
 
    return new RSVP.Promise(function(resolve, reject) { 
 
    setTimeout(function() { 
 
     $('#list').append("<li>Checking status for " + item.title); 
 
     resolve(); 
 
    }, 1000); 
 
    }); 
 
} 
 

 
function init() { 
 
    var fileList = [{ 
 
    title: "First object" 
 
    }, { 
 
    title: "Second object" 
 
    }, { 
 
    title: "Third object" 
 
    }]; 
 

 
    var statusCheck = fileList.map(function(item) { 
 
    return checkFileStatus(item); 
 
    }); 
 

 
    var promises = { 
 
    promisesCheckFileStatus: statusCheck 
 
    }; 
 

 
    RSVP.hash(promises).then(function() { 
 
    $('#list').append("<li>This should happen last!"); 
 
    }); 
 
} 
 

 

 

 
init();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<script src="//cdn.jsdelivr.net/rsvp/3.0.6/rsvp.js"></script> 
 
<div> 
 
    <ul id="list"></ul> 
 
</div>

ответ

1

Объект, который вы пытаетесь решить с hash() имеет массив заполненный обещаниями. hash разрешает только ключи/значения, которые обещают сами.

Итак, где у вас есть эта

var promises = { 
    key: [promise1, promise2, promise3] 
}; 

вы должны иметь

var promises = { key: PromiseThatWillResolveToOtherPromises }; 

Изменить

var promises = { 
    promisesCheckFileStatus: statusCheck 
}; 

в

var promises = { 
    promisesCheckFileStatus: RSVP.all(statusCheck) 
}; 
+0

Ничего себе, что простую вещь, чтобы не заметить. В следующий раз, я буду следить за тем, что я действительно передаю как параметры! Спасибо! –

1

Неверная часть хеша. Ключ promisesCheckFileStatus содержит массив, а не обещание. Вам нужно сделать что-то вроде этого:

var promises = { 
    promisesCheckFileStatus: checkFileStatus(fileList[0]), 
    promisesCheckFileStatus1: checkFileStatus(fileList[1]), 
    promisesCheckFileStatus2: checkFileStatus(fileList[2]), 
}; 
Смежные вопросы