2015-05-18 53 views
2

我正在使用承諾訪問我的數據庫(elasticsearchjs,它使用Bluebird)。保存更改變量的承諾

對於我列表中的每個ID,我正在開始一個新的查詢。現在我想知道查詢失敗時元素的ID。

var idList = ['id1', 'id2', 'id3', '...']; 
var promises = []; 

for (var i = 0; i < size; i++) { 

    // dbQueryFunction returns a promise object 
    promises.push(dbQueryFunction(idList[i]) 
    .then(function(data) { 
     // Do stuff... 
    }) 
    .error(function(errorMessage) { 
     console.log('[ERROR] id: ' + id); //<== Print ID here 
    }) 
); 
} 

// Wait for all promises to be resolved 
Promise.all(promises) 
    .then(function() { 
    console.log('Everything is done!'); 
    }); 

如何在我的承諾中保存更多信息?我嘗試使用Promise.bind(),但無法正常工作。

編輯:

爲了闡明關於「大小」的變量:這是一個代碼段,其中我想要的第一n個元素的結果。所以大小等於或小於我的數組大小。

+0

什麼是你拒絕承諾(也就是說,是什麼導致他們錯誤)? –

+0

是你試圖做任何機會重試? –

+0

@BenjaminGruenbaum:我得到一個vew條目超時錯誤。我想知道發生超時錯誤的條目以進一步調查此問題。 – fwind

回答

4

一種解決方案是這樣的:

var promises = idList.map(function(id){ 
    return dbQueryFunction(id) 
    .then(function(data) { 
     // Do stuff... 
    }) 
    .error(function(errorMessage) { 
     console.log('[ERROR] id: ' + id); 
    }); 
}); 

(如果size變量不保持陣列的大小,使用idList.slice(0,size)代替idList)。

備註bind:可能,也許,是可用這裏(添加.bind(idList[i]),然後登錄this),但問題是你沒有創建(因此不擁有)所承諾的對象。如果查詢庫取決於特定的上下文會怎樣?

+0

但是忽略了'size'約束。 –

+0

@BenjaminGruenbaum我認爲這是數組的大小。我編輯過。 –

+0

'dbQueryFunction(idList [i])'應該是'dbQueryFunction(id)'我相信 –

0
var idList = ['id1', 'id2', 'id3', '...']; 
var promises = []; 

// Could you do this? 
    promises.push(dbQueryFunction(idList[i]) 
    .then(function(data) { 
     // Do stuff... 
     idList.deleteID(idList[(promises.length - 1) || 0]); 
     // Or something to remove the successful ids from the list 
     // leaving you with the idList of the unsuccessful ids 
    }) 
    .error(function(errorMessage) { 
     console.log('[ERROR] id: ' + idList[0]); //<== Print ID here 
    }) 
); 

Array.prototype.deleteID = function(array,id){ 
    array.forEach(function(el,indx,arr){ 
     if(el == id){ 
     arr.splice(indx,1); 
     } 
    }); 
};