2016-11-27 2 views
0

Я столкнулся с небольшими проблемами в своем коде обещания, где мой Promise.map, кажется, заканчивается преждевременно. Я уверен, что это проблема с моей логикой, но с кодом я не уверен, как отлаживать его.Перспектива Bluebird .map заканчивается преждевременно?

В настоящее время, он выводит [], B, A, A с blobList размером 2. Как я могу его так, что он заканчивает толкая к imgList и, таким образом, выводит A, A, [*some base64 encoding here*], B, где в функции .then, imgList не должен быть пустым?

blobToBase64 Функция

blobToBase64(blob, cb) { 
    var reader = new window.FileReader(); 
    reader.readAsDataURL(blob); 

    reader.onloadend = function() { 
     let base64data = reader.result; 
     cb(base64data); 
    } 
} 

Основная функция

Promise.map(blobList, function(blobObj){ 
    helper.blobToBase64(blobObj.data, (fn) => { 
     imgList.push(fn); 
     console.log('A'); 
    }) 
}).then(function(){ 
    console.log(imgList); 
    console.log('B'); 
}) 

ответ

2

Здесь вы идете:

var promises = blobList.map((blobObj) => { 
    return new Promise((resolve, reject) => { 
     helper.blobToBase64(blobObj.data, (fn) => { 
      imgList.push(fn); 
      console.log('A'); 
      return resolve(); 
     }) 
    }) 
}) 

Promise 
    .all(promises) 
    .then(() => { 
     console.log(imgList); 
     console.log('B'); 
    }) 
+0

Просто, чтобы проверить, является переменной обещает объект, содержащий несколько обещание? И все проверки, чтобы убедиться, что все обещания разрешены (или отклонены)? – Bryan

+1

Переменные обещания - это набор обещаний. .all - это функция, которая выполняет каждое обещание в массиве и только вызывает. then, когда все были решены. – kjonsson

+0

@Bryan, если 'helper.blobToBase64()' принадлежит вам, чтобы его можно было проработать, и сохранить код более высокого уровня просто. Также полезно использовать 'Promise.map()', как вы пытались в вопросе, позволяя 'imgList' поставляться по цепочке обещаний; нет беспорядочного внешнего var. –

Смежные вопросы