2015-06-02 208 views
0

我一直在使用承諾,但偶爾偶爾發現我似乎無法解決的問題(沒有雙關語意思)。爲什麼在通過承諾解決之前,我的承諾散列解決?

我有一個文件數組,我必須爲每個文件執行異步函數調用以獲取一些元數據。

我使用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>

回答

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