我一直在使用承諾,但偶爾偶爾發現我似乎無法解決的問題(沒有雙關語意思)。爲什麼在通過承諾解決之前,我的承諾散列解決?
我有一個文件數組,我必須爲每個文件執行異步函數調用以獲取一些元數據。
我使用RSVP.hash()
並傳遞了一個函數返回的承諾數組,它加載了一些元數據並將其作爲屬性添加到文件中。我的問題是hash()
函數返回的許諾會在任何傳遞的promise被解析之前得到解決,因此它很快就會進入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>
哇,多麼簡單的事情可以忽略。下一次,我會確保我記住我實際通過的參數!謝謝! –